C++ 从目录中选择上次修改的文件

C++ 从目录中选择上次修改的文件,c++,directory,C++,Directory,我需要知道如何选择给定目录中最后修改/创建的文件 我目前有一个名为XML的目录,其中有许多XML文件。但是我只想选择最后修改的文件。您可以使用和查找extfile,它们提供了一个描述文件大小和修改时间的结构。Boost.Filesystem提供了。您可以使用它对目录中的文件进行排序 Booost .FielSypS/和(Boost)通常会对C++新成员有点吓人,因此您可能首先想检查OS的解决方案。 < P>我使用以下函数列出文件夹内的所有项目。它将所有文件写入字符串向量,但您可以更改它 bool

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


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

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

Boost.Filesystem提供了。您可以使用它对
目录中的文件进行排序
<代码> Booost .FielSypS/<代码>和(Boost)通常会对C++新成员有点吓人,因此您可能首先想检查OS的解决方案。

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

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;
}
bool ListContents(向量和目标、字符串目录、字符串过滤器、bool递归)
{
WIN32_FIND_DATAA ffd;
句柄hFind=无效的句柄值;
DWORD dwError=0;
//准备字符串
如果(dir.back()!=“\\”)dir+=“\\”;
//安全检查
if(dir.length()>=最大路径){
错误(“无法打开文件夹%s:路径太长”,dir.c_str());
返回false;
}
//目录中的第一个条目
hFind=FindFirstFileA((dir+filter).c_str(),&ffd);
if(hFind==无效的句柄值){
错误(“无法打开文件夹%s中的文件夹:访问第一个条目时出错。”,dir.c_str());
返回false;
}
//列出目录中的文件
做{
//忽略.和..文件夹,它们会导致堆栈溢出
如果(strcmp(ffd.cFileName,“.”==0)继续;
如果(strcmp(ffd.cFileName,“…”)==0)继续;
//是目录吗?
if(ffd.dwFileAttributes和文件属性目录)
{
//递归进入
if(递归地)
ListContents(dest,dir+ffd.cFileName,filter,递归,content\u type);
}
//将文件添加到我们的列表中
else dest.push_back(dir+ffd.cFileName);
}而(FindNextFileA(hFind和ffd));
//获取最后一个错误
dwError=GetLastError();
if(dwError!=错误\u无\u更多\u文件){
错误(“读取文件夹%s中的文件列表时出错”,dir.c_str());
返回false;
}
返回true;
}
(不要忘记包括windows.h)

你要做的是调整它以找到最新的文件。 ffd结构(WIN32_FIND_DATAA数据类型)包含ftCreationTime、ftLastAccessTime和ftLastWriteTime,您可以使用它们来查找最新的文件。
这些成员是文件时结构,您可以在此处找到文档:

您尝试了什么?你将如何着手解决这个问题?编辑你的问题。什么操作系统?你需要一个便携式代码吗?我在Windows平台上工作。@ USE1149126:如果你是C++新手,那么。为了枚举文件,您不需要阅读整本书,但需要了解基本知识。您可能需要添加这是一个仅限Windows的解决方案。