2013-09-30 22 views
0

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

由于这是像

dir /o:-d *.csv 

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

+0

您是否问过如何读取目录,或者在读取目录后如何识别最近的文件?你试过什么了? –

+0

将此视为一个两部分问题:找到具有正确扩展名的文件,然后使用[stat](http://en.wikipedia.org/wiki/Stat_(system_call))检查上次修改时间。然后展示你得到了什么。 – usr2564301

+2

其实,忘记'stat'(除非你想要一个没有Windows的函数)。像往常一样在Windows中,[有一个API](http://msdn.microsoft.com/en-us/library/windows/desktop/aa364418(v = vs.85).aspx)。 – usr2564301

回答

0

在windows中,您可以使用GetFileTime() Api。在linux中,fstat()可以帮助你。

1

您可以使用提供一组目录搜索功能的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 
相关问题