Выберите последний измененный файл из каталога - PullRequest
6 голосов
/ 21 января 2012

Мне нужно знать, как я могу выбрать последний измененный / созданный файл в данном каталоге.

В настоящее время у меня есть каталог с именем XML, и внутри него много файлов XML.Но я бы хотел выбрать только последний измененный файл.

Ответы [ 3 ]

4 голосов
/ 22 января 2012

Я использую следующую функцию для вывода списка всех элементов внутри папки. Он записывает все файлы в виде строкового вектора, но вы можете изменить это.

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 голос
/ 21 января 2012

Вы можете использовать FindFirstFile и FindNextFile, они предоставляют структуру, описывающую размер файла, а также время изменения.

0 голосов
/ 21 января 2012

Boost.Filesystem предлагает last_write_time .Вы можете использовать это для сортировки файлов в directory.Boost.Filesystem и (Boost) в целом могут быть немного пугающими для новичка в C ++, поэтому вы можете сначала проверить решение для своей ОС.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...