我目前正在处理对 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 成本并不太贪心。
谢谢
最佳答案
可能最快删除目录的方法是不删除它:-)
或者,更准确地说,延迟它。如果您的目的是简单地摆脱(例如)/home/pax/porn
,只需将它mv
到同一文件系统上的其他地方(/home/no_user/junk/pax/porn
) 并启动后台进程以在低优先级进程中摆脱它。
我所说的低优先级并不一定是指 CPU 运行,更多的是该进程将根据您的需要尽可能减少资源使用。
例如,如果您需要将此 I/O 效果分散到很长一段时间内,您可以让进程删除文件或目录,并在两者之间有延迟。虽然 I/O 可能类似于您一次删除所有文件,但在短时间内测得的 I/O 会更少。
这种方法的优点是,根据任何进程寻找您“删除”的目录,它几乎立即就消失了。
恢复磁盘空间当然需要一段时间,因为这是以延迟的方式发生的,但这是否重要取决于您的相对优先级。
关于c - Unix下最快的删除目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10600864/