Windows下文件列举,搜索
Windows下列举文件用的函数是 FindFirstFile 和 FindNextFile ,另外一个结构体是WIN32_FIND_DATA
以下是MSDN对于WIN32_FIND_DATA的定义
typedef struct _WIN32_FIND_DATA { DWORD dwFileAttributes; FILETIME ftCreationTime; FILETIME ftLastAccessTime; FILETIME ftLastWriteTime; DWORD nFileSizeHigh; DWORD nFileSizeLow; DWORD dwReserved0; DWORD dwReserved1; TCHAR cFileName[MAX_PATH]; TCHAR cAlternateFileName[14]; } WIN32_FIND_DATA, *PWIN32_FIND_DATA, *LPWIN32_FIND_DATA;
FindFirstFile 和 FindNextFile 传递的参数都如下
HANDLE WINAPI FindFirstFile( _In_ LPCTSTR lpFileName, _Out_ LPWIN32_FIND_DATA lpFindFileData );
BOOL WINAPI FindNextFile( _In_ HANDLE hFindFile, _Out_ LPWIN32_FIND_DATA lpFindFileData );
这里我们需要使用的是cFileName这个参数,另外我们还可以查询访问时间以及写入时间,分别是ftLastAccessTime, ftLastWriteTime
另外在Windows中,目录使用 // 或者 \\ 均可,而在Linux中只能使用 /
列举某个文件下的所有文件
#include <Windows.h> #include <tchar.h> #include <stdio.h> #include <iostream> using namespace std; char filename[100][10]; int main() { int index = 0; int i; WIN32_FIND_DATA findData; HANDLE hFile = FindFirstFile(TEXT("Debug\\*"), &findData); memset(filename, 0, sizeof(filename)); if(INVALID_HANDLE_VALUE == hFile) { printf("find first file error\n"); exit(1); } while(FindNextFile(hFile, &findData)) { for(i = 0; findData.cFileName[i] != '\0'; i++) { filename[index][i] = findData.cFileName[i]; } filename[index++][i] = '\0'; } for(i = 0; i < index; i++) printf("%s\n", filename[i]); return 0; }
如果是目录的话,那就需要不断的递归了
void FindFiles(CString &strPath) { WIN32_FIND_DATA findData; CString strTemp = strPath; strTemp.Format(_T("%s\\*.*"), strPath);//查找指定目录下的直接的所有文件和目录 HANDLE hFile = FindFirstFile(strTemp, &findData); while (hFile != INVALID_HANDLE_VALUE) { if (findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { //如果是目录 if(findData.cFileName[0] != _T('.')) { //排除.和..文件夹 strTemp = strPath+ CString("\\") + findData.cFileName; //获得完整路径 FindFiles(strTemp); //递归查找当前目录的文件 } } else { strTemp = strPath+ CString("\\") + findData.cFileName; } if(!FindNextFile(hFile, &findData)) { break; } } }