c++ - 如何在C++中的目录中使用通配符匹配查找最后修改的文件

标签 c++ windows file mingw

在 C++ 中,如何根据上次修改时间在目录中找到最新的文件,如 *.csv(或文件名中的其他通配符匹配模式)?假设在windows下使用mingw gcc?

因为这是一个像这样的单行命令

dir /o:-d *.csv

我目前使用_popen() 来调用上面的系统命令并提取结果。我想知道是否有比 popen 解决方案更好的替代方案。

最佳答案

您可以使用提供了一组目录搜索功能的 Windows API。使用目录搜索时,您指定一个文件搜索条件,然后重复调用,直到没有更多文件或找到您想要的文件。

这些函数的好处在于,作为返回目录中下一个文件的一部分,还会返回一个包含各种文件属性的结构,包括日期和时间戳以及文件是否隐藏。

因此您可以使用类似于以下源代码片段的循环:

WIN32_FIND_DATA search_data;
uInt2++;
TCHAR *ptcsFileNameEnd = tcsFileName + _tcslen(tcsFileName);

_tcscat (ptcsFileNameEnd, _T("\\*.*"));
memset(&search_data, 0, sizeof(WIN32_FIND_DATA));
HANDLE handle = FindFirstFile(tcsFileName, &search_data);

while(handle != INVALID_HANDLE_VALUE)
{
    if ((search_data.dwFileAttributes & (FILE_ATTRIBUTE_DIRECTORY | FILE_ATTRIBUTE_SYSTEM | FILE_ATTRIBUTE_HIDDEN)) == 0) {
        *(ptcsFileNameEnd + 1) = 0;
        _tcscat (ptcsFileNameEnd, search_data.cFileName);
        if (ReadAndProcessLicenseFile (tcsFileName)) {
            uInt2 = 0;
            break;
        }
    }
    if(FindNextFile(handle, &search_data) == FALSE)
        break;
}

在您的情况下,您会查看日期时间戳的 search_data 结构并进行比较。

编辑 结构 WIN32_FIND_DATA 在 winbase.h 中定义,对于我的打开了 UNICODE 的 Visual Studio C++ 2005 环境,该结构如下所示。

typedef struct _WIN32_FIND_DATAW {
    DWORD dwFileAttributes;
    FILETIME ftCreationTime;
    FILETIME ftLastAccessTime;
    FILETIME ftLastWriteTime;
    DWORD nFileSizeHigh;
    DWORD nFileSizeLow;
    DWORD dwReserved0;
    DWORD dwReserved1;
    WCHAR  cFileName[ MAX_PATH ];
    WCHAR  cAlternateFileName[ 14 ];
#ifdef _MAC
    DWORD dwFileType;
    DWORD dwCreatorType;
    WORD  wFinderFlags;
#endif
} WIN32_FIND_DATAW, *PWIN32_FIND_DATAW, *LPWIN32_FIND_DATAW;
#ifdef UNICODE
typedef WIN32_FIND_DATAW WIN32_FIND_DATA;
typedef PWIN32_FIND_DATAW PWIN32_FIND_DATA;
typedef LPWIN32_FIND_DATAW LPWIN32_FIND_DATA;
#else

关于c++ - 如何在C++中的目录中使用通配符匹配查找最后修改的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19084765/

相关文章:

c++ - 为返回对 vector 的函数创建 SWIG 类型映射

c++ - sem_t union/struct C++ 继承

c++ - C++中的递归真的那么慢吗?

c# - 当方法的新实例运行 C# 时,以前的方法仍在将数据写入文本文件

c# - 如何从文本文件中获取 2 个数据点

c++ - 从 .pcap 文件中获取 HID 报告描述符

用于创建用户配置文件的 Windows API

c# - 如何使用 .NET WebRequest 和 PFX 证书了解 Windows/.NET 和 Linux/Mono 之间的区别?

python - 是否有跨操作系统的标准方法将 "tags"添加到文件

java - "java.lang.ArrayIndexOutOfBoundsException"数组逻辑问题