65.9K
CodeProject 正在变化。 阅读更多。
Home

用于通过 VC++ 查找文件夹中总文件数和文件夹数的代码

starIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIconemptyStarIcon

1.03/5 (30投票s)

2003年12月17日

1分钟阅读

viewsIcon

152904

这个小函数块将返回一个结构,其中包含给定文件夹中存在的文件夹和文件的数量。

引言

这是我的第一篇文章,实际上,对于我目前正在进行的项目,我需要找出主文件夹中存在的文件的数量和文件夹的数量,就像 Windows 资源管理器在状态栏中显示的那样。为此,我搜索了网络,浏览了许多网站,但我没有找到详细信息,甚至没有得到任何想法,然后我编写了以下函数来获得所需的结果,并决定将其发布到这个网站,以便其他有同样需求的人可以使用。这个想法是由 Infosys Banglore, India 的 Sai 先生提供的。

关于代码,我们需要使用 WIN32_FIND_DATA API。WIN32_FIND_DATA 结构描述了 FindFirstFile、FindFirstFileEx 或 FindNextFile 函数找到的文件。

FindFirstFile 函数通过搜索目录中与指定文件名匹配的文件来给出目录中的第一个文件。FindFirstFile 会同时检查子目录名和文件名。

所有其他函数(FindNextFile 等)的工作方式类似。

您需要传入要查找大小的文件夹,然后它将返回该文件夹中存在的文件夹和文件的数量。以下是用 vc++ 编写的函数:

 //我用于描述文件夹的结构 typedef struct _MyFolder { int Folders; int Files; }MyFolder; //上述结构由以下函数返回 //函数 "Folder" 开始 **************  MyFolder* Folder(CString strFolderPathLocal) { char strFolderName[_MAX_PATH] = {0}; strcpy(strFolderName,strFolderPathLocal); // 我想使用 CString 的每一个字符,因此我 // 使用了字符数组 char *pdest; int ch = '\\'; int result,length; int Folders =0; int Files =0; pdest = strchr(strFolderName,ch); result = pdest - strFolderName + 1; length = strlen(strFolderName); BOOL Drive = FALSE; //操作 FolderName 以便查看 Folder 中的所有项 if(strFolderName[strlen(strFolderName)] == '\\') strcat(strFolderName,"*.*"); else if(pdest != NULL && result == 3 && length == 3) //如果指定了像 c:\ 这样的驱动器 { strcat(strFolderName,"\*.*"); Drive = TRUE; } else strcat(strFolderName,"\\*.*"); //定义文件夹 MyFolder *Folder = new MyFolder; Folder->Folders =0; Folder->Files =0; WIN32_FIND_DATA FindFileData; //附加目标文件夹以获取第一个文件句柄。 //获取第一个文件句柄 HANDLE hFile = FindFirstFile(strFolderName,&FindFileData); //现在循环遍历此文件夹下的所有文件和文件夹 while(hFile) { //忽略系统目录 "." 和 "..",就像古老的 MS-DOS 时代一样 if((stricmp(FindFileData.cFileName,".")!=0) && (stricmp (FindFileData.cFileName,"..")!=0) &&(stricmp(FindFileData.cFileName,"") !=0)) { //检查当前对象是文件夹还是文件 if(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { Folder->Folders += 1; MyFolder *Folder2 = new MyFolder; CString subFolderPath; subFolderPath.Empty(); subFolderPath += strFolderPathLocal; subFolderPath += "\\"; subFolderPath += FindFileData.cFileName; //它是一个子文件夹,因此再次递归调用 // 子文件夹,并添加该子文件夹中的文件数 Folder2 = Folder(subFolderPath); Folder->Folders += Folder2->Folders; Folder->Files += Folder2->Files; delete Folder2; } else if (!((FindFileData.dwFileAttributes & FILE_ATTRIBUTE_TEMPORARY) ||(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN)) ) { Folder->Files += 1; } } if(!FindNextFile(hFile,&FindFileData)) { //如果没有找到,则将 hFile 设置为 NULL,以便 // 我们能够退出 while 循环 FindClose(hFile); hFile = NULL; } } return Folder; //为 Folder 分配的内存需要由外部清除。 } } 
& 就这样..
© . All rights reserved.