从一个目录中选择最后修改的文件

6

我需要知道如何选择给定目录中的最后修改/创建文件。

我当前有一个名为XML的目录,里面有许多XML文件。但我只想选择最后修改的文件。


1
你已经尝试过什么了吗?你会如何解决这个问题?编辑你的问题。 - ScarletAmaranth
1
什么操作系统?你需要可移植的代码吗? - Alessandro Pezzato
我正在使用Windows平台工作。 - Fahad.ag
如果你是C++的新手,那么挑选一本好的入门C++书籍。为了枚举文件,你不需要读完整本书,但你需要知道基础知识。 - In silico
3个回答

4
我用以下函数列出文件夹内的所有项目。它会将所有文件写入一个字符串向量中,但你可以更改它。
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
你可以使用 FindFirstFile 和 FindNextFile,它们会返回一个结构体,其中包含文件的大小和修改时间等信息。

你可能想要补充说明这是一个仅适用于Windows的解决方案。 - pmr

0

Boost.Filesystem提供了last_write_time功能。您可以使用它来对directory中的文件进行排序。Boost.Filesystem和(Boost)通常对于C ++新手可能会有一点吓人,因此您可能需要先检查您的操作系统的解决方案。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接