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;

        }

    }

}


 

 

 

 

 

 

你可能感兴趣的:(windows)