Unix下最快的删除目录方法

3
我目前正在编写对I/O敏感的代码,我正在寻找从C代码中以最快的方式删除Unix下的目录。我希望编写的代码可以在所有常用平台上工作(Android,MacOS X,Linux),但我愿意为不同版本的Unix编写不同的实现(我怀疑BSD/MacOS X和Linux/Android有不同的技巧)。
以下是我考虑过的一些方法:
- 在所有平台上,我可以使用opendir,readdir_r等函数遍历目录结构,使用dirent->_d_type来区分目录和文件 - 这在Linux下似乎是标准化的,但在MacOS X下不是; - 在Linux/Android下,如果我选择这个选项,我还可以使用dirfd和unlinkat来快速删除每个文件; - 在所有平台上,我可以使用ftw函数遍历目录结构,使用flag来区分目录和文件; - 在所有平台上,我可以使用fts_open,fts_read等函数遍历目录结构,使用FTSENT->fts_info来区分目录和文件; - 我没有检查过,但我有印象BSD / MacOS X的copyfile函数可以用于删除目录。
其中一个技术是否比其他技术更好?我是否遗漏了一些明显的东西?
请注意,我主要关心最小化I/O和通用系统调用,而不太在意CPU成本。
谢谢
1个回答

3

也许最快删除目录的方法是不要真正删除它,而是推迟删除。如果您只是想摆脱(例如)/home/pax/porn,只需将其mv到同一文件系统上的其他位置(/home/no_user/junk/pax/porn),然后启动一个后台进程以低优先级处理它。

通过低优先级,我不一定指CPU grunt,更多的是该进程将尽力根据您的需求最小化资源使用。

例如,如果您需要在长时间段内分散I/O效果,则可以使进程在删除文件或目录之间设置延迟。虽然I/O可能与同时删除所有文件时类似,但短时间跨度上测得的I/O会更少。

这种方法的优点是,对于寻找您“删除”的目录的任何进程,它几乎立即消失了。

当然,恢复磁盘空间需要一些时间,因为它是以推迟的方式进行的,但这取决于您的相对优先级是否重要。


你选择的示例目录名称可能会冒犯一些读者。顺便说一句,答案加一分。 - David Heffernan
2
“色情”在这种情况下实际上是用于研究视网膜外周渐进性坏死的数据文件,这只是一个有趣的巧合,缩写正好是那个词 - 如果是其他任何东西,我的妻子会非常不高兴。 - paxdiablo
我喜欢你的回答。不幸的是,在我的情况下,推迟删除可能会产生不良的副作用 - 由于隐私原因,一些数据正在被删除,因此在它实际上可能正在等待删除时通知用户已被删除可能不是一个好主意(例如,请参见http://www.contractoruk.com/news/002586.html)。 - Yoric
实际上,唯一剩下的问题是在进程退出时刷新所有内容。虽然仍然很重要 :) - Yoric
@Yoric,你的代码不必撒谎 :-) 你可以简单地说明数据正在被删除,而他们可以在此期间继续执行其他操作。甚至可以在完成后发送电子邮件(或以其他方式通知),因为执行删除操作的脚本可以是任意复杂的。 - paxdiablo
很抱歉,不是那种情况。但是,我现在已经实现了延迟目录删除功能,具备在应用程序退出之前刷新的能力,如果在删除完成之前应用程序崩溃,则可以在下次启动时恢复。现在,我仍然希望刷新操作成为最快速的删除目录,因此我回到了最初的问题 :) - Yoric

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接