首页 > 解决方案 > 在使用 smbd 或 ssh 协议删除任何目录之前,我是否必须递归删除所有文件和文件夹?

问题描述

我尝试使用 SMBD 客户端删除远程 Linux 机器中的目录:

  DiskShare.rmdir(folderName, true); 

在使用 smbd 或其他协议(ssh 协议)删除任何目录之前,我是否必须递归删除所有文件和文件夹?

如果是 - 为什么?

标签: javasshsmbshared-directory

解决方案


为了删除一个目录(至少在 Unix 上),它必须是空的。如果不是,系统调用将失败并显示ENOTEMPTYor EEXIST。这意味着,是的,您需要在删除目录本身之前递归地删除其中的所有文件和目录。在您的情况下,可能有一种方便的方法可以做到这一点(例如递归删除函数),或者您可能需要自己实现它。

原因是系统调用,如rmdir,通常被认为是相当有效且易于推理的。必须删除文件和包含的目录以保持文件系统一致;毕竟,如果由于父目录将不再存在而无法访问它们,您将不希望它们消耗磁盘空间。

如果rmdir隐式删除它们,那可能会很昂贵,因为可能有很多文件和目录要删除,而且也很难推理,因为如果删除其中一个失败,您将不知道是哪一个它是,只有一个错误代码来代表整个失败。

至少 SFTP协议没有提供递归删除数据的方法,但您的库可以。在您的特定示例中,true参数似乎是递归删除标志,因此您指定的函数调用将删除目录及其所有内容;您无需单独执行此操作。如果您使用的是等效的 SFTP 客户端,看起来它本身并没有实现,所以您需要这样做。


推荐阅读