我已尝试使用smbd客户端删除远程linux计算机中的目录:
DiskShare.rmdir(folderName, true);
在使用smbd或其他协议(ssh协议)删除任何目录之前,是否必须递归删除所有文件和文件夹?如果是,为什么?
e0bqpujr1#
要删除目录(至少在unix上),它必须为空。如果不是,则系统调用将失败 ENOTEMPTY 或 EEXIST . 这意味着,是的,在删除目录本身之前,您需要递归地删除其中的所有文件和目录。在您的情况下,可能有一种方便的方法(例如递归删除函数),或者您可能需要自己实现它。原因是系统调用 rmdir ,通常被认为是合理有效且易于推理的。必须删除文件和包含的目录,以保持文件系统的一致性;毕竟,如果由于父目录将不再存在而无法访问它们,您就不会希望它们占用磁盘空间。如果 rmdir 隐式删除它们可能会很昂贵,因为可能有很多文件和目录要删除,而且也很难推理,因为如果删除其中一个失败,您将不知道它是哪一个,只有一个错误代码代表整个失败。至少sftp协议没有提供递归删除数据的方法,但是您的库可能会这样做。在您的特定示例中 true 参数似乎是递归删除标志,因此您指定的函数调用将删除目录及其所有内容;你不需要分开做。如果您使用的是等效的sftp客户端,那么它本身似乎没有实现,因此您需要这样做。
ENOTEMPTY
EEXIST
rmdir
true
1条答案
按热度按时间e0bqpujr1#
要删除目录(至少在unix上),它必须为空。如果不是,则系统调用将失败
ENOTEMPTY
或EEXIST
. 这意味着,是的,在删除目录本身之前,您需要递归地删除其中的所有文件和目录。在您的情况下,可能有一种方便的方法(例如递归删除函数),或者您可能需要自己实现它。原因是系统调用
rmdir
,通常被认为是合理有效且易于推理的。必须删除文件和包含的目录,以保持文件系统的一致性;毕竟,如果由于父目录将不再存在而无法访问它们,您就不会希望它们占用磁盘空间。如果
rmdir
隐式删除它们可能会很昂贵,因为可能有很多文件和目录要删除,而且也很难推理,因为如果删除其中一个失败,您将不知道它是哪一个,只有一个错误代码代表整个失败。至少sftp协议没有提供递归删除数据的方法,但是您的库可能会这样做。在您的特定示例中
true
参数似乎是递归删除标志,因此您指定的函数调用将删除目录及其所有内容;你不需要分开做。如果您使用的是等效的sftp客户端,那么它本身似乎没有实现,因此您需要这样做。