2012-01-21 84 views
6

我需要知道的是,我如何才能在給定目錄中選擇最後修改/創建的文件。從目錄中選擇最後修改的文件

我目前有一個名爲XML的目錄,裏面有很多XML文件。但我想只選擇最後一個修改過的文件。

+1

你有什麼試過嗎?你會如何解決這個問題?編輯你的問題。 – ScarletAmaranth

+1

什麼操作系統?你需要一個可移植的代碼? –

+0

我正在開發Windows平臺.. –

回答

4

我使用以下函數列出文件夾內的所有項目。它將所有的文件寫入一個字符串向量,但是你可以改變它。

bool ListContents (vector<string>& dest, string dir, string filter, bool recursively) 
{ 
    WIN32_FIND_DATAA ffd; 
    HANDLE hFind = INVALID_HANDLE_VALUE; 
    DWORD dwError = 0; 

    // Prepare string 
    if (dir.back() != '\\') dir += "\\"; 

    // Safety check 
    if (dir.length() >= MAX_PATH) { 
     Error("Cannot open folder %s: path too long", dir.c_str()); 
     return false; 
    } 

    // First entry in directory 
    hFind = FindFirstFileA((dir + filter).c_str(), &ffd); 

    if (hFind == INVALID_HANDLE_VALUE) { 
     Error("Cannot open folder in folder %s: error accessing first entry.", dir.c_str()); 
     return false; 
    } 

    // List files in directory 
    do { 
     // Ignore . and .. folders, they cause stack overflow 
     if (strcmp(ffd.cFileName, ".") == 0) continue; 
     if (strcmp(ffd.cFileName, "..") == 0) continue; 

     // Is directory? 
     if (ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) 
     { 
      // Go inside recursively 
      if (recursively) 
       ListContents(dest, dir + ffd.cFileName, filter, recursively, content_type); 
     } 

     // Add file to our list 
     else dest.push_back(dir + ffd.cFileName); 

    } while (FindNextFileA(hFind, &ffd)); 

    // Get last error 
    dwError = GetLastError(); 
    if (dwError != ERROR_NO_MORE_FILES) { 
     Error("Error reading file list in folder %s.", dir.c_str()); 
     return false; 
    } 

    return true; 
} 

(不要忘了包括WINDOWS.H)

你所要做的就是適應它來查找最新的文件。 ffd結構(WIN32_FIND_DATAA數據類型)包含ftCreationTime,ftLastAccessTime和ftLastWriteTime,您可以使用它們來查找最新的文件。 這些成員是FILETIME結構,你可以在這裏找到文檔:http://msdn.microsoft.com/en-us/library/windows/desktop/ms724284%28v=vs.85%29.aspx

1

您可以使用FindFirstFile和FindNextFile,它們提供一個結構來描述文件的大小以及修改時間。

+0

您可能想補充說這是一個僅限Windows的解決方案。 – pmr

0

Boost.Filesystem offers last_write_time。你可以用這個來排列directory中的文件。對於C++新手來說,Boost.Filesystem和(Boost)通常會有點嚇人,因此您可能需要首先檢查您的操作系統的解決方案。

相關問題