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;
        }
    }
}


 

 

 

 

 

 

posted @ 2013-08-17 22:26  pangbangb  阅读(292)  评论(0编辑  收藏  举报