2012-01-21 21 views
6

Potrzebuję wiedzieć, w jaki sposób mogę wybrać plik Last modified/created w danym katalogu.Wybierz ostatni zmodyfikowany plik z katalogu

Obecnie mam katalog o nazwie XML, a wewnątrz znajduje się wiele plików XML. Ale chciałbym wybrać tylko ostatni zmodyfikowany plik.

+1

Czego próbowałeś jeszcze? Jak podchodziłbyś do tego problemu? Edytuj swoje pytanie. – ScarletAmaranth

+1

Jaki system operacyjny? Czy potrzebujesz przenośnego kodu? –

+0

Pracuję na platformie Windows .. –

Odpowiedz

4

Używam poniższej funkcji do wyświetlania wszystkich elementów w folderze. Zapisuje wszystkie pliki w wektorze łańcuchowym, ale można to zmienić.

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; 
} 

(nie zapomnij podać windows.h)

Co trzeba zrobić, to dostosować ją znaleźć najnowszy plik. Struktura ffd (typ danych WIN32_FIND_DATAA) zawiera ftCreationTime, ftLastAccessTime i ftLastWriteTime, których można użyć do znalezienia najnowszego pliku. Te elementy są strukturami FILETIME, można znaleźć dokumentację tutaj: http://msdn.microsoft.com/en-us/library/windows/desktop/ms724284%28v=vs.85%29.aspx

1

Można użyć FindFirstFile i FindNextFile, dostarczają one strukturę opisującą rozmiar pliku, jak również zmodyfikowany czas.

+0

Możesz dodać, że jest to rozwiązanie wyłącznie dla systemu Windows. – pmr

0

Boost.Filesystem oferuje last_write_time. Możesz użyć tego do sortowania plików w pliku directory. Boost.Filesystem i (Boost) ogólnie rzecz biorąc może być trochę onieśmielające dla nowego przybysza C++, więc możesz najpierw sprawdzić rozwiązanie dla twojego OS.

Powiązane problemy