如何根据 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 中定义,对于我的 Visual Studio C++ 2005 环境,UNICODE 已打开,该结构如下所示。
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
在 Windows 中,您可以使用GetFileTime()
Api。在linux下,fstat()
可以帮到你。