2012-01-21 10 views
6

Ho bisogno di sapere come posso selezionare l'ultimo file modificato/creato in una determinata directory.Selezionare l'ultimo file modificato da una directory

Attualmente ho una directory denominata XML e all'interno ci sono molti file XML. Ma vorrei selezionare solo l'ultimo file modificato.

+1

Cosa hai provato ancora? Come andresti ad affrontare questo problema? Modifica la tua domanda. – ScarletAmaranth

+1

Quale sistema operativo? Hai bisogno di un codice portatile? –

+0

Sto lavorando su una piattaforma Windows .. –

risposta

4

Uso la seguente funzione per elencare tutti gli elementi all'interno di una cartella. Scrive tutti i file in un vettore stringa, ma puoi cambiarlo.

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

(non dimenticate di includere windows.h)

Quello che devi fare è adattarlo per trovare il file più recente. La struttura ffd (tipo di dati WIN32_FIND_DATAA) contiene ftCreationTime, ftLastAccessTime e ftLastWriteTime, è possibile utilizzare quelli per trovare il file più recente. Questi membri sono strutture FILETIME, puoi trovare la documentazione qui: http://msdn.microsoft.com/en-us/library/windows/desktop/ms724284%28v=vs.85%29.aspx

1

È possibile utilizzare FindFirstFile e FindNextFile, forniscono una struttura che descrive la dimensione del file e il tempo modificato.

+0

Si potrebbe voler aggiungere che questa è una soluzione solo per Windows. – pmr

0

Boost.Filesystem offre last_write_time. È possibile utilizzare questo per ordinare i file in un directory. Boost.Filesystem e (Boost) in generale possono essere un po 'intimidatori per un nuovo C++ new-comer in modo da poter controllare prima una soluzione per il sistema operativo.

Problemi correlati