2011-11-10 39 views
0

在「C」代碼中,我想列出目錄中的所有文件並刪除最舊的文件。我怎麼做?列出目錄中的文件並在C/C++中刪除它們

我可以使用popen嗎?或者我們有其他解決方案?

感謝,

+1

Plain C沒有任何目錄的概念,因此您需要指定您想要執行此操作的操作系統。 – caf

+0

Linux 2.6.x內核 – Kitcha

+1

@caf:實際上,純C(這似乎暗示了編程語言本身)甚至沒有關於文件或其他任何事物的概念。 C由大約32個關鍵字組成,幾個操作員就是這樣。所有這些文件,目錄等概念都是在庫中定義的。所以如果你不是指語言定義本身,那麼問題是標準C庫中定義的目錄是什麼?答案是肯定的。特別是dirent.h接口到OS的目錄概念是一個X.Open和POSIX.1標準。 –

回答

3

從標籤中,我假設你想在符合POSIX的系統中做到這一點。在這種情況下的文件夾中列出文件的代碼片段是這樣的:

#include <dirent.h> 
#include <sys/types.h> 
#include <stdio.h> 

DIR* dp; 
struct dirent* ep; 
char* path = "/home/mydir"; 

dp = opendir(path); 
if (dp != NULL) 
{ 
    printf("Dir content:\n"); 
    while(ep = readdir(dp)) 
    { 
    printf("%s\n", ep->d_name); 
    } 
} 
closedir(dp); 

要檢查文件創建或修改時間,使用stat(男子2 STAT)。要刪除文件,只需使用功能remove(const char* path)

+0

我不完全確定刪除開放目錄中的文件是安全的(因爲掃描的目錄是在掃描時更新)。我的建議是兩次完成:第一次掃描,找到要刪除的文件,第二次刪除它們。 –

+0

這是非常好的評論。但是,在這種情況下,您必須在刪除之前完成掃描,因爲OP要刪除最舊的文件(您必須檢查所有文件才能找到最早的文件)。 – Patryk

1

可以使用readdiropendir 掃描目錄,如果你想遍歷(遞歸)的文件層次ftsnftw。不要忘記忽略當前目錄"."和父".."之一的條目。您可能還想使用系統調用stat

+0

謝謝。讓我嘗試一下。 – Kitcha

+0

如果沒有'opendir()',你不能使用'readdir()' - 一個不會被另一個使用。 – Dave

+0

謝謝,我編輯,使其readdir和opendir –

2

在Linux(以及任何POSIX系統)上,您可以通過調用opendir()/readdir()/closedir()來閱讀目錄。然後,您可以在每個目錄條目上調用stat()以確定它是否是文件,以及它的訪問/修改/狀態更改時間。

如果您對「最老」的定義取決於文件的創建時間,那麼您就不穩固了 - 傳統上UNIX並沒有記錄創建時間。在Linux上,一些最新的文件系統通過擴展屬性file.crtime(您使用getxattr()sys/xattr.h訪問)提供擴展屬性,但您必須處理該屬性不存在的常見情況。

相關問題