2011-11-18 98 views
5

我必须删除C代码中的数百个文件。我在循环中使用“删除”。有没有比使用“删除”更快的方式来做到这一点?我问这个,因为我不能用“删除”来给wildchars。从C代码中删除文件

+0

为什么你不在管道中输入ls的结果,这样就不必输入所有名称 – lc2817

+0

问题是,该目录中有50000个文件。我必须在必要时删除其中的一小部分。 “删除”对我来说工作正常,但需要一段时间才能完成。我正在寻找更快的东西。如果我可以在“C”中执行相同的操作,我不想从“C”调用shell命令。 – Kitcha

+0

你可以使用python吗? :) – lc2817

回答

10

不,没有比在POSIX系统上使用remove()unlink()更快的方式 - 循环。

系统rm命令也这样做 - 至少在命令行中给出名称的简单非递归情况下。 shell扩展了元字符,并且rm(in)着名地删除了它被告知要删除的内容,而不知道在命令行中使用的灾难性的*.*表示法。 (在递归情况下,它使用这样的功能如nftw()在深度优先的顺序和重复的调用目录结构遍历unlink()删除文件和rmdir()以除去(现在为空的)目录。)

POSIX提供函数(glob()wordexp())以生成(POSIX)shell中使用的元字符的文件名列表,并加上fnmatch()以查看名称是否与模式匹配。

+0

是不是'*'与'*。*'相同,还是有一些细微差别?当人们提到'rm'启示时,他们似乎总是使用'*。*' –

+0

在Windows下*需要*。*';在Unix上,'*'就足够了(实际上,比'*。*'更具破坏性,因为简单的'*'匹配更多的名字)。我稍微辩论使用哪一个,并且(好或坏)选择'*。*'。这两个都是坏消息。 (而且我见过的最糟糕的'rm'大灾变是删除了以root用户/ /作为主目录创建的临时用户帐户;'remove user'命令删除了其主目录下的所有内容。系统可以在丢失关键文件后运行,幸运的是,它是一个全新的系统,并且从前一天开始有备份。) –

+0

感谢您的输入。我可以生成没有任何问题的文件名。我唯一担心的是更快地发出“删除”命令。 – Kitcha

0

你可以使用system来产生一个可以为你做扩展的shell。这可能不会比在循环中调用unlink()更快,因为它必须产生一个shell(启动一个新进程)。但编码会更容易。