[转]C++下遍历文件夹ITeye - 亚美娱乐

[转]C++下遍历文件夹ITeye

2019年03月01日13时36分20秒 | 作者: 鹏涛 | 标签: 文件,遍历,文件夹 | 浏览: 1908

Link:http://www.cnblogs.com/summerRQ/articles/2375749.html
编写程序遍历文件夹及其子文件夹下一切文件,并输出到规范输出流或许文件流。
1. 先考虑在单层目录下,遍历一切文件。以C:\WINDOWS为例:
用到数据结构_finddata_t,文件信息结构体的指针。

struct _finddata_t
 unsigned attrib; //文件特点
 time_t time_create; //文件创立时刻
 time_t time_access; //文件上一次拜访时刻
 time_t time_write; //文件上一次修正时刻
 _fsize_t size; //文件字节数
 char name[_MAX_FNAME]; //文件名
}; 


文件特点是无符号整数,取值为相应的宏:_A_ARCH(存档),_A_SUBDIR(文件夹),_A_HIDDEN(躲藏),_A_SYSTEM(体系),_A_NORMAL(正常),_A_RDONLY(只读)。简单看出,经过这个结构体,咱们能够得到关于该文件的许多信息。结合以下函数,咱们能够将文件信息存储到这个结构体中:
//按FileName命名规矩匹配当时目录第一个文件
_findfirst(_In_ const char * FileName, _Out_ struct _finddata64i32_t * _FindData); 
 //按FileName命名规矩匹配当时目录下一个文件
_findnext(_In_ intptr_t _FindHandle, _Out_ struct _finddata64i32_t * _FindData);
 //封闭_findfirst回来的文件句柄
_findclose(_In_ intptr_t _FindHandle);

_findfirst 函数回来的是匹配到文件的句柄,数据类型为long。遍历进程能够指定文件类型,这经过FileName的赋值来完成,例如要遍历C:\WINDOWS下的一切.exe文件
bool transfer(string fileName = "C:\\Windows\\*.exe", int exeNum = 0)
 _finddata_t fileInfo;
 long handle = _findfirst(fileName.c_str(), fileInfo);
 if (handle  -1L)
 cerr "failed to transfer files" endl;
 return false;
 exeNum ++;
 cout fileInfo.name endl;
 } while (_findnext(handle, fileInfo)  0);
 cout " .exe files number: " exeNum endl;
 return true;
}


2. 遍历文件夹及其子文件夹下一切文件。操作体系中文件夹目录是树状结构,运用深度查找战略遍历一切文件。用到_A_SUBDIR特点,可运行程序如下:
void dfsFolder(string folderPath, ofstream fout)
 _finddata_t FileInfo;
 string strfind = folderPath + "\\*";
 long Handle = _findfirst(strfind.c_str(), FileInfo);
 if (Handle  -1L)
 cerr "can not match the folder path" endl;
 exit(-1);
 //判别是否有子目录
 if (FileInfo.attrib _A_SUBDIR) 
 //这个句子很重要
 if( (strcmp(FileInfo.name,".") != 0 ) (strcmp(FileInfo.name,"..") != 0)) 
 string newPath = folderPath + "\\" + FileInfo.name;
 dfsFolder(newPath, fout);
 else 
 fout folderPath "\\" FileInfo.name " ";
 }while (_findnext(Handle, FileInfo)  0);
 _findclose(Handle);
 fout.close();
}

在判别有无子目录的if分支中,因为体系在进入一个子目录时,匹配到的头两个文件(夹)是"."(当时目录),".."(上一层目录)。需求疏忽掉这两种状况。当需求对遍历到的文件做处理时,在else分支中增加相应的代码就好


遍历某种类型文件
BOOL LoadFilesFromDirecroty(CString strDirectory)
 WIN32_FIND_DATA cFindData;
 HANDLE hFind = NULL;
 CString strFullPathName;
 strFullPathName = strDirectory + _T("\\*.DLL");
 hFind = FindFirstFile(strFullPathName, cFindData);
 if (INVALID_HANDLE_VALUE  hFind)
 FindClose(hFind);
 return FALSE;
 if(cFindData.dwFileAttributes FILE_ATTRIBUTE_DIRECTORY)
 //Special for return
 if (strcmp(cFindData.cFileName, ".")  0
 strcmp(cFindData.cFileName, "..")  0 )
 LoadFilesFromDirecroty(strFullPathName + cFindData.cFileName);
 else
 CString strTemp = cFindData.cFileName;
 strTemp += "";                          
			
版权声明
本文来源于网络,版权归原作者所有,其内容与观点不代表亚美娱乐立场。转载文章仅为传播更有价值的信息,如采编人员采编有误或者版权原因,请与我们联系,我们核实后立即修改或删除。

猜您喜欢的文章