2012-01-21 8 views
6

Necesito saber cómo puedo seleccionar el archivo Última modificación/creación en un directorio determinado.Seleccione el último archivo modificado de un directorio

Actualmente tengo un directorio llamado XML, y dentro de eso hay muchos archivos XML. Pero me gustaría seleccionar solo el último archivo modificado.

+1

¿Qué ha intentado todavía? ¿Cómo abordarías este problema? Edita tu pregunta. – ScarletAmaranth

+1

¿Qué sistema operativo? ¿Necesitas un código portátil? –

+0

Estoy trabajando en la plataforma de Windows .. –

Respuesta

4

Utilizo la siguiente función para enumerar todos los elementos dentro de una carpeta. Escribe todos los archivos en un vector de cadena, pero puede cambiar eso.

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

(no se olvide de incluir windows.h)

Lo que tienes que hacer es adaptarlo a encontrar el archivo más reciente. La estructura ffd (tipo de datos WIN32_FIND_DATAA) contiene ftCreationTime, ftLastAccessTime y ftLastWriteTime, puede usarlos para encontrar el archivo más nuevo. Estos miembros son estructuras FILETIME, usted puede encontrar la documentación aquí: http://msdn.microsoft.com/en-us/library/windows/desktop/ms724284%28v=vs.85%29.aspx

1

Puede usar FindFirstFile y FindNextFile, entregan una estructura que describe el archivo como el tamaño y el tiempo modificado.

+0

Es posible que desee agregar que esta es una solución solo para Windows. – pmr

0

Boost.Filesystem ofrece last_write_time. Puede usar esto para ordenar los archivos en un directory. Boost.Filesystem y (Boost) en general puede ser un poco intimidante para un recién llegado de C++, por lo que es posible que primero desee comprobar una solución para su sistema operativo.

Cuestiones relacionadas