请我如何c语言遍历文件夹

请我如何c语言遍历文件夹,第1张

#include <windows.h>

/************************************************/

*参数说明:

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

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/6039966.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-03-12
下一篇 2023-03-12

发表评论

登录后才能评论

评论列表(0条)

保存