/************************************************/
*参数说明:
char *pszDestPath为需要遍历的目标路径
/************************************************/
EnmuDirectory(char *pszDestPath)
{
//此结构说明参MSDN
WIN32_FIND_DATA FindFileData
//查找文件的句柄
HANDLE hListFile
//绝对路径,例:c:\windows\system32\cmd.exe
char szFullPath[MAX_PATH]
//相对路径
char szFilePath[MAX_PATH]
//构造相对路径
wsprintf(szFilePath, "%s\\*", pszDestPath)
//查找第一个文件,获得查找句柄,如果FindFirstFile返回INVALID_HANDLE_VALUE则返回
if((hListFile = FindFirstFile(szFilePath, &FindFileData)) == INVALID_HANDLE_VALUE)
{
//查找文件错误
return 1
}
else
{
do
{
//过滤.和..
//“.”代表本级目录“..”代表父级目录
if( lstrcmp(FindFileData.cFileName, TEXT(".")) == 0 ||
lstrcmp(FindFileData.cFileName, TEXT("..")) == 0 )
{
continue
}
//构造全路径
wsprintf(szFullPath, "%s\\%s", pszDestPath, FindFileData.cFileName)
//读取文件属性,如果不是文件夹
if(!(FindFileData.dwFileAttributes &FILE_ATTRIBUTE_DIRECTORY))
{
//这里你可以自己添加分析是某种类型文件的代码。可以根据
//扩展名分析。
//这里有个实例,你可以看看
//有必要初始化一下
char *pszFileType = NULL
//把pszFileType指向cFileName的倒数第三个数符。因为一般扩展名长为3个字符。
//当然,你也可以用其它方法分析扩展名。或倒序查“.”
pszFileType = &(FindFileData.cFileName[strlen(FindFileData.cFileName) - 3])
//如果是jpg结尾的文件
if(!stricmp(pszFileType, "jpg"))
{
FILE *fp
//或许这里打开C:\\data.txt不应该用"w+",你可试着来
fp = fopen("c:\\data.txt", "w+")
if(fp) fputs(szFullPath, fp)
fclose(fp)
}
}
//如果是文件夹,则递归调用EnmuDirectory函数
if(FindFileData.dwFileAttributes &FILE_ATTRIBUTE_DIRECTORY)
{
EnmuDirectory(szFullPath)
}
//循环,查找下一个文件
}while(FindNextFile(hListFile, &FindFileData))
}
//关闭句柄
FindClose(hListFile)
//清空结构。可有可无的一句代码。函数退出会自动清空。
ZeroMemory(&FindFileData, sizeof(FindFileData))
return 0
}
这是windows api版的,还有MFC版的和C版的。要的话来找我Q:503267714
使用dir.h库的两个函数即可:findfirst和findnext。首先调用findfirst函数查找是否有满足条件的某目录文件,如果返回值非0则表示找不到返回。
如果findfirst返回值为0,则循环调用findnext函数,根据返回值,如果为0,结束循环,遍历结束。否则循环调用findnext即可遍历,直到返回非0值即可。
当然,这两个函数需要定义一个结构体来存储函数返回的数据。结构体如下:
struct
ffblk
{
char
ff_reserved[21]
/*DOS保留字*/
char
ff_attrib
/*文件属性*/
int
ff_ftime
/*文件时间*/
int
ff_fdate
/*文件日期*/
long
ff_fsize
/*文件长度*/
char
ff_name[13]
/*文件名*/
}
将结构体中的ff_name[13]显示出来即可。
windows系统,代码举例如下:include <windows.h>
#include <stdio.h>
#include <io.h>
void func(const char *dir, int *dirs, int *files)
{
_finddata_t fi
char fname[MAX_PATH]
strcpy(fname, dir)
strcat(fname, "\\*.*")
int handle = _findfirst(fname, &fi)
if (handle >0)
{
do
{
if (fi.attrib &0x10) // 是子目录
{
(*dirs)++
if (!strcmp(fi.name, ".") || !strcmp(fi.name, "..")) continue//特殊目录处理
sprintf(fname, "%s\\%s", dir, fi.name)// 生成新路径存于fname
func(fname, dirs, files)// 递归调用
}
else (*files)++
} while (!_findnext(handle, &fi))
}
_findclose(handle)
}
int main()
{
int dirs = 0, files = 0
func("D:\\", &dirs, &files)
printf("%d 个目录,%d 个文件\n", dirs, files)
return 0
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)