c++代码如下:
int GetAllFilepathFromfolder(char* Path)
{
char szFind[MAX_PATH];
WIN32_FIND_DATA FindFileData;
strcpy(szFind,Path);
strcat(szFind,"\\*.*");//再路劲后加"*.*"标识当前目录下的所有文件和目录
HANDLE hFind=FindFirstFile(szFind,&FindFileData);
if(INVALID_HANDLE_VALUE == hFind)
return -1;
do
{
if(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)//如果文件属性是目录
{
if(strcmp(FindFileData.cFileName,".")!=0 && strcmp(FindFileData.cFileName, "..")!=0)//过滤掉"."和".."目录
{
//发现子目录,递归之
char szFile[MAX_PATH] = {0};
strcpy(szFile,Path);
strcat(szFile,"\\");
strcat(szFile,FindFileData.cFileName);
GetAllFilepathFromfolder(szFile);
}
}
else
{
//如果是文件,则直接处理之
std::cout << lpPath << "\\" << FindFileData.cFileName << std::endl;
}
}while(FindNextFile(hFind,&FindFileData));
FindClose(hFind);
return 0;
}
原理如下:
typedef struct _WIN32_FIND_DATA {
DWORD dwFileAttributes; //文件属性
FILETIME ftCreationTime; // 文件创建时间
FILETIME ftLastAccessTime; // 文件最后一次访问时间
FILETIME ftLastWriteTime; // 文件最后一次修改时间
DWORD nFileSizeHigh; // 文件长度高32位
DWORD nFileSizeLow; // 文件长度低32位
DWORD dwReserved0; // 系统保留
DWORD dwReserved1; // 系统保留
TCHAR cFileName[ MAX_PATH ]; // 长文件名
TCHAR cAlternateFileName[ 14 ]; // 8.3格式文件名
} WIN32_FIND_DATA, *PWIN32_FIND_DATA;
1.dwFileAttributes,文件属性字段,通过此字段可以检查到究竟是一个文件还是一个子目录,以及其他的文件属性,此字段可取如下值:
●FILE_ATTRIBUTE_ARCHIVE ——文件包含归档属性。
●FILE_ATTRIBUTE_COMPRESSED ——文件和目录被压缩。
●FILE_ATTRIBUTE_DIRECTORY ——找到的是一个目录。
●FILE_ATTRIBUTE_HIDDEN ——文件包含隐含属性。
●FILE_ATTRIBUTE_NORMAL ——文件没有其他属性。
●FILE_ATTRIBUTE_READONLY ——文件包含只读属性。
●FILE_ATTRIBUTE_SYSTEM ——文件包含系统属性。
●FILE_ATTRIBUTE_TEMPORARY ——文件是一个临时文件。
2.cFileName,长文件名,返回的文件名中会包含"."和"..","."为当前目录,".."为上级目录,需要过滤掉;