64,648
社区成员
发帖
与我相关
我的任务
分享
#include "stdafx.h"
#include "windows.h"
#include "stdio.h"
#include "string.h"
void TraverseFile(char* path)
{
WIN32_FIND_DATA wfd = {0};
char szText[256] = {0};
sprintf(szText,"%s/*.*",path);
HANDLE hFind = FindFirstFile(szText,&wfd);
if(hFind == INVALID_HANDLE_VALUE)
{
printf ("Invalid file handle. Error is %u \n", GetLastError());
return ;
}
if(wfd.dwFileAttributes != FILE_ATTRIBUTE_DIRECTORY)
{
printf("%s\n",wfd.cFileName);
}
else if(wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY
&& strcmp(wfd.cFileName,".") != 0
&& strcmp(wfd.cFileName,".") != 0)
{
printf("[%s]\n",wfd.cFileName);
char szTextr[256] = {0};
strcat(szTextr,path);
sprintf(szTextr,"/%s",wfd.cFileName);
TraverseFile(szTextr);
}
while(FindNextFile(hFind,&wfd))
{
if (wfd.dwFileAttributes != FILE_ATTRIBUTE_DIRECTORY)
{
printf ("%s\n", wfd.cFileName);
}
else if(wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY
&& strcmp(wfd.cFileName, ".") != 0
&& strcmp(wfd.cFileName, "..") != 0)
{
printf("[%s]\n",wfd.cFileName);
char szTexts[256] = {0};
strcat(szTexts,path);
sprintf(szTexts,"/%s",wfd.cFileName);
TraverseFile(szTexts);
}
}
}
int main(int argc, char* argv[])
{
TraverseFile("G:");
return 0;
}
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <shlwapi.h>
#pragma comment(lib, "shlwapi.lib")
typedef BOOL (CALLBACK *FINDFILESPROC)(LPCTSTR, LPARAM);
BOOL CALLBACK ShowFoundFiles(LPCTSTR pszFile, LPARAM lParam);
BOOL WINAPI FindAllFilesRecursively(LPCTSTR, FINDFILESPROC, LPARAM);
int __cdecl main(
int argc,
char *argv[]
)
{
// 返回 TRUE 表示成功,FALSE 表示失败或 ShowFoundFiles 返回 FALSE
BOOL fResult = FindAllFilesRecursively(TEXT("D:"), ShowFoundFiles, 0);
printf("FindAllFilesRecursively returned: %d\n", fResult);
return 0;
}
BOOL CALLBACK ShowFoundFiles(
LPCTSTR pszFile,
LPARAM lParam
)
{
_tprintf(TEXT("%s\n"), pszFile);
// 返回 TRUE 继续查找,返回 FALSE 终止。
return TRUE;
}
BOOL WINAPI FindAllFilesRecursively(
LPCTSTR pszRootPath,
FINDFILESPROC ffproc,
LPARAM lpParam
)
{
TCHAR szFileFind[MAX_PATH] = { 0 };
if (PathCombine(szFileFind, pszRootPath, TEXT("*.*")) == NULL)
{
SetLastError(ERROR_INVALID_NAME);
return FALSE;
}
WIN32_FIND_DATA wfd = { 0 };
HANDLE hFindFile = FindFirstFile(szFileFind, &wfd);
if (hFindFile == INVALID_HANDLE_VALUE)
{
SetLastError(ERROR_INVALID_NAME);
return FALSE;
}
__try {
do {
if ((lstrcmpi(wfd.cFileName, TEXT(".")) != 0) &&
(lstrcmpi(wfd.cFileName, TEXT("..")) != 0))
{
BOOL fResult = FALSE;
TCHAR szNextPath[MAX_PATH] = { 0 };
if (PathCombine(szNextPath, pszRootPath, wfd.cFileName) == NULL)
{
return FALSE;
}
if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
fResult = FindAllFilesRecursively(szNextPath, ffproc, lpParam);
}
else
{
fResult = ffproc(szNextPath, lpParam);
}
if (!fResult)
{
return FALSE;
}
}
} while (FindNextFile(hFindFile, &wfd));
}
__finally {
FindClose(hFindFile);
}
return TRUE;
}
对于文件路径的处理,我个人更偏好使用来自 shlwapi.dll 中的 Windows API 系列:// 扩展名相关操作
PathAddExtension
PathFindExtension
PathRemoveExtension
PathRenameExtension
// 附加路径或组合两个路径
PathAppend
PathCombine
// 判断是否根目录或文件夹
PathIsRoot
PathIsDirectory
// 文件是否存在
PathFileExists
// 文件名是否合法
PathIsFileSpec
// 获取或移除命令行参数
PathGetArgs
PathRemoveArgs
// 文件名是否匹配通配符
PathMatchSpec
// 得到一个文件夹相对于另一文件夹的相对路径
PathRelativePathTo
// 查找文件名
PathFindFileName
// 移除文件名
PathRemoveFileSpec
系统 API 的好处,如 PathAppend 和 PathCombine 无需考虑路径反斜线以及相对路径,系统均能正确处理。如:TCHAR szDir[MAX_PATH] = TEXT("D:");
TCHAR szRet[MAX_PATH] = { 0 };
// 以下8行的结果都是一样: C:\WINDOWS
PathCombine(szRet, TEXT("C:"), TEXT("WINDOWS"));
PathCombine(szRet, TEXT("C:"), TEXT(".\\WINDOWS"));
PathCombine(szRet, TEXT("C:"), TEXT("Program Files\\..\\WINDOWS"));
PathCombine(szRet, TEXT("C:"), TEXT(".\\Program Files\\..\\WINDOWS"));
PathCombine(szRet, TEXT("C:\\"), TEXT("WINDOWS"));
PathCombine(szRet, TEXT("C:\\"), TEXT(".\\WINDOWS"));
PathCombine(szRet, TEXT("C:\\"), TEXT("Program Files\\..\\WINDOWS"));
PathCombine(szRet, TEXT("C:\\"), TEXT(".\\Program Files\\..\\WINDOWS"));
// 以下任意一行的结果都是一样: D:\WINDOWS
PathAppend(szDir, TEXT("WINDOWS"));
PathAppend(szDir, TEXT(".\\WINDOWS"));
PathAppend(szDir, TEXT("Program Files\\..\\WINDOWS"));
PathAppend(szDir, TEXT(".\\Program Files\\..\\WINDOWS"));
//strcat(szTexts,path);
sprintf(szTexts,"%s/%s",path,wfd.cFileName);