2011-11-18 112 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(啓動一個新進程)。但編碼會更容易。