【问题标题】:Select the last modified file from a directory从目录中选择最后修改的文件
【发布时间】:2012-02-15 19:42:34
【问题描述】:

我需要知道,如何在给定目录中选择 Last modified/created 文件。

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

【问题讨论】:

  • 你尝试过什么?您将如何解决这个问题?编辑您的问题。
  • 什么操作系统?您需要可移植的代码吗?
  • 我在windows平台上工作..
  • @user1149126:如果你是 C++ 新手,那么pick up a good introductory C++ book。出于枚举文件的目的,您无需阅读整本书,但您需要了解基础知识。

标签: c++ directory


【解决方案1】:

我使用以下函数列出文件夹中的所有项目。它将所有文件写入字符串向量中,但您可以更改它。

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      您可以使用FindFirstFile 和 FindNextFile,它们提供了一个描述文件大小和修改时间的结构。

      【讨论】:

      • 您可能需要补充一点,这是一个仅限 Windows 的解决方案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-09-30
      • 2016-08-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多