问题描述
我尝试使用 SMBD 客户端删除远程 Linux 机器中的目录:
diskShare.rmdir(folderName,true);
在使用 smbd 或其他协议 - ssh 协议删除任何目录之前,我是否必须递归删除所有文件和文件夹?
如果是 - 为什么?
解决方法
为了删除一个目录(至少在 Unix 上),它必须是空的。如果不是,系统调用将失败并显示 ENOTEMPTY
或 EEXIST
。这意味着,是的,您需要在删除目录本身之前递归删除其中的所有文件和目录。可能在您的情况下,有一种方便的方法可以做到这一点(例如递归删除函数),或者您可能需要自己实现。
原因是像 rmdir
这样的系统调用通常被认为是相当高效且易于推理的。必须删除文件和包含的目录以保持文件系统一致;毕竟,如果因为父目录不再存在而无法访问它们,您不会希望它们占用磁盘空间。
如果 rmdir
隐式删除它们,那可能会很昂贵,因为可能有很多文件和目录要删除,而且也很难推理,因为如果删除其中一个失败,你不知道是哪一个,只有一个错误代码代表整个失败。
至少 SFTP 协议 没有提供递归删除数据的方法,但您的库可以。在您的特定示例中, true
参数似乎是递归删除标志,因此您指定的函数调用将删除目录及其所有内容;您不需要单独执行此操作。如果您使用的是等效的 SFTP 客户端,则它本身似乎并未实现,因此您需要这样做。