我目前正在处理对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成本并不太贪心。
由于
答案 0 :(得分:3)
删除目录的最快方法可能是不删除它: - )
或者更确切地说,推迟它。如果您的意图是简单地摆脱(例如)/home/pax/porn
,只需mv
将其移至同一文件系统(/home/no_user/junk/pax/porn
)上的其他位置,并启动后台进程以摆脱它处于低优先级的过程中。
由于低优先级,我不一定意味着CPU咕噜声,更多的是该流程将根据您的需要尽量减少资源使用。
例如,如果您需要将此I / O效果分散很长时间,则可以让进程删除文件或目录之间的延迟。虽然I / O可能与您一次删除所有文件的情况类似,但短时间跨度的测量I / O会更少。
这种方法的优势在于,根据寻找你已经“删除”的目录的任何过程,它已经消失了,几乎是立即的。
恢复磁盘空间当然需要一段时间,因为这是以延迟的方式发生的,但这取决于您的相对优先级是否重要。