2012-01-21 9 views
6

特定のディレクトリでLast modified/createdファイルを選択する方法を知っておく必要があります。ディレクトリから最後に変更されたファイルを選択してください

私は現在XMLという名前のディレクトリを持っています。その中には多くのXMLファイルがあります。しかし、最後に変更されたファイルだけを選択したいと思います。

+1

何を試してみましたか?あなたはこの問題にどのように近づきますか?あなたの質問を編集してください。 – ScarletAmaranth

+1

どのようなOSですか?ポータブルコードが必要ですか? –

+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

ブースト。ファイルシステムは、last_write_timeを提供しています。これを使用してdirectoryのファイルをソートすることができます。 Boost.Filesystemと(Boost)は一般に、C++の新機能を少し脅かす可能性があるので、OSのソリューションを最初にチェックしたいかもしれません。

関連する問題