2014-11-30 2 views
2

У меня есть каталог с некоторыми файлами расширения разного типа. Среди них есть .grb2 файлы (метеоданные). Например:Как читать имя файла последнего измененного файла в каталоге?

...

20140729_0000_000.grb2

20140729_1200_000.grb2

20140730_1200_000.grb2

...

Дело в том, что я хотел бы прочитайте с C++ последний измененный файл только этого типа (.grb2). Поскольку они названы по дате, было бы также полезно прочитать файл с наибольшим числом в имени своего файла, так как это самые последние данные meteo. Я сейчас читаю его вручную (ввод его имени файла непосредственно на C++), что явно не оптимально, так как я загружаю много этих файлов.

Есть ли у вас какие-либо идеи? Кстати, я работаю в Windows (если это поможет).

+3

'FindFirstFile', а затем' FindNextFile' для перечисления всех файлов. Используйте строку '* .grb2' в качестве строки поиска. Или используйте библиотеку C++, если вы хотите быть немного более портативным. –

ответ

4

Можно использовать файловую систему Boost. Boost Filesystem реализует следующую стандартную библиотечную спецификацию.

Вы можете использовать его, чтобы написать более надежный код и быть независимым от платформы в то же время:

Live On Coliru

for (auto&& entry : boost::make_iterator_range(fs::directory_iterator("."), {})) { 
    fs::path p = entry.path(); 
    if (is_regular_file(p) && p.extension() == ".grb2") 
    { 
     std::time_t timestamp = fs::last_write_time(p); 
     if (timestamp > latest_tm) { 
      latest = p; 
      latest_tm = timestamp; 
     } 
    } 
} 

Хотя этот код не был написан в блокноте ¹, его испытывается:

/tmp$mkdir q
/tmp$cd q
/tmp/q$touch {a..z}.grb2
/tmp/q$../test

Доклады:

Last modified: "./z.grb2" 

/tmp/q$touch k.grb2
/tmp/q$../test

Доклады:

Last modified: "./k.grb2" 

¹ Полное раскрытие: Она была написана в Vim на Ubuntu Linux

1

Вы должны перечислить все файлы, получить их последнее изменение времени и сравнить их. Вот мой код:

#include <windows.h> 
#include <stdio.h> 

int main() 
{ 
    WIN32_FIND_DATAW ffd; 
    wchar_t const* directory = L"D:\\My_GRB_Files\\"; 
    wchar_t currentFile[MAX_PATH], lastModifiedFilename[MAX_PATH]; 
    FILETIME currentModifiedTime, lastModified; 
    HANDLE hFile; 
    bool first_file = true; 

    HANDLE hFind = FindFirstFileW(L"D:\\My_GRB_Files\\*.grb2", &ffd); 

    if (INVALID_HANDLE_VALUE == hFind) 
    { 
     return 255; 
    } 

    do 
    { 
     if (!(ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) 
     { 
      wcscpy(currentFile, directory); 
      wcscat(currentFile, ffd.cFileName); 
      // open file to read it's last modified time 
      hFile = CreateFileW(currentFile, GENERIC_READ, FILE_SHARE_READ, NULL, 
        OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); 
      if(INVALID_HANDLE_VALUE != hFile) 
      { 
       // get it's last write time 
       if(GetFileTime(hFile, NULL, NULL, &currentModifiedTime) != 0) 
       { 
        if(first_file) 
        { 
         lastModified = currentModifiedTime; 
         wcscpy(lastModifiedFilename, ffd.cFileName); 
         first_file = false; 
        } 
        else 
        { 
         // First file time is earlier than second file time. 
         if(CompareFileTime(&lastModified, &currentModifiedTime) == -1) 
         { 
          lastModified = currentModifiedTime; 
          wcscpy(lastModifiedFilename, ffd.cFileName); 
         } 
        } 
       } 
       CloseHandle(hFile); 
      } 
     } 
    } 
    while (FindNextFileW(hFind, &ffd) != 0); 

    FindClose(hFind); 

    wprintf(L"Last modified file is: %s%s", directory, lastModifiedFilename); 
} 

У меня было настроение, поэтому я закодировал эту функцию для вас. Надеюсь, это поможет вам и другим людям, которые будут посещать эту страницу в будущем. Я закодировал его в блокноте, поэтому извините, если есть ошибка. Удачи.

 Смежные вопросы

  • Нет связанных вопросов^_^