Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C Unix下最快的删除目录_C_Performance_Unix - Fatal编程技术网

C Unix下最快的删除目录

C Unix下最快的删除目录,c,performance,unix,C,Performance,Unix,我目前正在研究对I/O非常敏感的代码,从性能角度来看,我正在寻找从C代码中删除Unix下目录的最快方法。我想写一些能在所有通用平台(Android、MacOS X、Linux)上运行的东西,但我愿意为不同风格的Unix编写不同的实现(我怀疑BSD/MacOS X和Linux/Android有不同的技巧) 以下是我想到的几件事: 在所有平台上,我都可以使用opendir、readdir\u r等工具浏览目录结构,使用dirent->\u d\u type区分目录和文件,这在Linux下似乎是标准

我目前正在研究对I/O非常敏感的代码,从性能角度来看,我正在寻找从C代码中删除Unix下目录的最快方法。我想写一些能在所有通用平台(Android、MacOS X、Linux)上运行的东西,但我愿意为不同风格的Unix编写不同的实现(我怀疑BSD/MacOS X和Linux/Android有不同的技巧)

以下是我想到的几件事:

  • 在所有平台上,我都可以使用
    opendir
    readdir\u r
    等工具浏览目录结构,使用
    dirent->\u d\u 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
,只需将其清除到同一文件系统上的其他地方(
/home/no_user/junk/pax/porn
),并启动后台进程以在低优先级进程中清除它

我所说的低优先级,不一定是指CPU咕噜声,更重要的是进程将根据您的需要尽可能减少资源使用

例如,如果您需要在很长一段时间内分散此操作的I/O效果,则可以让进程删除文件或目录,并在这段时间内进行延迟。虽然I/O可能类似于一次删除所有文件,但在短时间跨度内测量的I/O会更少

这种方法的优点是,根据任何查找您“删除”的目录的过程,它几乎立刻就消失了


恢复磁盘空间当然需要一段时间,因为这是以延迟的方式进行的,但这取决于您的相对优先级。您选择的示例目录名可能会冒犯某些读者+请注意,答案是“色情”,在本例中,实际上是研究进行性视网膜外坏死的数据文件,只是一个有趣的巧合,首字母缩略词出现了——如果是其他的话,我妻子会很不高兴。我喜欢你的答案。不幸的是,在我的情况下,推迟删除可能会产生不必要的副作用–一些数据是出于隐私原因而被删除的,因此通知用户该数据已被删除,而实际上可能正在等待删除可能不是一个好主意(请参见示例)。实际上,剩下的唯一问题是在进程退出时刷新所有内容。尽管如此,仍然很重要:)@Yoric,你的代码不必撒谎:-)你可以简单地声明数据正在被删除,并且他们可以在删除数据时继续进行操作。您甚至可以在完成后发送电子邮件(或以其他方式进行通信),因为执行删除的脚本可能非常复杂。