- /* 文件名:searchAllFile.cpp
- * int searchAllFile(string filePath, //要搜索的文件路径
- * int layer //layer==0 //搜索的层次,输入路径的层次应该为0
- * string fileNameToSave); //存储文件信息的文件名,包括路径
- *
- *
- *
- *
- *
- *
- * <io.h>中定义了结构体 struct _finddata64i32_t (C风格),用来存储文件的各种信息
- *详细如下:
- *struct _finddata64i32_t
- * {
- * unsigned attrib;
- * __time64_t time_create; // -1 for FAT file systems
- * __time64_t time_access; // -1 for FAT file systems
- * __time64_t time_write;
- * _fsize_t size;
- * char name[260];
- * };
- *各参数意义如下:
- *unsigned attrib :4个字节,存储文件的属性
- * _A_ARCH (存档) 0x20
- * _A_SUBDIR(文件夹)0x10
- * _A_SYSTEM(系统)0x04
- * _A_HIDDEN(隐藏)0x02
- * _A_RDONLY(只读)0x01
- * _A_NORMAL(正常)0X00
- *这些都是<io.h>中定义的宏,每一个都是一个unsigned int,各属性叠加时进行或运算,如_A_HIDDEN|_A_RDONLY
- *
- *__time64_t time_create: 文件创建的时间
- *__time64_t time_access: 文件最后一次访问的时间
- *__time64_t time_write: 文件最后以此修改的时间
- *_fsize_t size: 文件的大小,字节为单位
- *char name[260]: 文件名
- *
- *--------------------------------------------------------------------------------------------------------------------------------
- *<io.h> 中定义了两个函数
- *long _findfirst64i32(const char * _Filename,struct _finddata64i32_t * _FindData); ,查找第一个_Filename的信息,存储到结构体_FindData中
- * 查找成功,返回一个用于继续查找的句柄(一个唯一的编号)
- * 查找 失败,返回-1
- *int _findnext64i32(long handle,struct _finddata64i32_t *fileinfo) ; 根据句柄handle查找下一个文件,存放在 fileinfo中
- * 查找成功,返回0,失败返回-1
- *ing _findclose(long handle); 关闭句柄handle,成功返回0,失败返回-1
- *---------------------------------------------------------------------------------------------------------------------------------------
- */
- #include<iostream>
- #include<string>
- #include<fstream>
- #include<io.h> //定义了结构体struct _finddata64i32_t(该结构体包含文件的相关属性,如文件名,文件的属性等
- //定义函数: long _findfirst64i32(char* fileName,struct _finddata64i32_t *fileinf0);
- //定义函数: int _findnext64i32(long handle,struct _finddata64i32_t *fileinfo);
- //定义函数: int _findclose(long handle);
- using namespace std;
- //定义链表结点
- struct fileInfoNode
- {
- struct _finddata64i32_t fileInfo; //保存文件信息的结构体
- string fileName;
- struct fileInfoNode* left;
- };
- //把文件信息连接到链表head中
- int saveToLink(struct fileInfoNode*& head, //链表的头结点,引用参量
- const string& fileName, //IN:文件名(包括路径)
- const struct _finddata64i32_t& fileInfo) //IN:文件信息结构体,引用参量
- {
- //建立一个结点
- fileInfoNode* p;
- p=new fileInfoNode;
- p->fileInfo=fileInfo; //把传入的文件信息复制进结点
- p->fileName=fileName;
- p->left=head;
- head=p;
- return 0;
- }
- //显示整个查找到的文件的信息
- void displayLink(struct fileInfoNode* head)//IN:头结点,值传递参数
- {
- while(head!=NULL)
- {
- cout<<"fileName: "<<head->fileName<<endl;
- cout<<"fileSize: "<<dec<<head->fileInfo.size<<"字节"<<endl;
- cout<<"fileAttrib: "<<"0x"<<hex<<head->fileInfo.attrib<<endl;
- cout<<"-------------------------------------------------------------------------------------------"<<endl;
- head=head->left;
- }
- }
- //把文件信息存储到文件 fileName 中
- void saveLinkToFile(struct fileInfoNode* head,string saveFileName,int counter)
- {
- ofstream fout;
- //打开文件
- fout.open(saveFileName.c_str());
- if((fout.is_open())==false)
- {
- cout<<"存储文件打开失败!"<<endl;
- exit(-1);
- }
- fout<<"the file number is: "<<counter<<endl;
- fout<<"-------------------------------------------------------------------------------------------------------"<<endl;
- while(head!=NULL)
- {
- fout<<"fileName: "<<head->fileName<<endl;
- fout<<"fileSize: "<<dec<<head->fileInfo.size<<"字节"<<endl;
- fout<<"fileAttrib: "<<"0x"<<hex<<head->fileInfo.attrib<<endl;
- fout<<"-------------------------------------------------------------------------------------------------------"<<endl;
- head=head->left;
- }
- //关闭文件
- fout.close();
- }
- //
- int searchAllFile(string filePath,//IN:文件所在的路径,如:f:\example
- int layer,//层次,只有层次为0时,才完成链表中文件信息的显示和存储
- string fileInfoOut) //IN:存储的文件名
- {
- struct _finddata64i32_t fileInfo;//保存文件信息的结构体
- static fileInfoNode* head=NULL; //fileInfoNode链表的头结点,静态存储
- static int counter=0; //记录文件数目
- long handle;//句柄
- int done;//查找nextfile是否成功
- string fileName=filePath+"\\*.*"; //要搜索的文件名
- //查找第一个文件,返回句柄
- handle=_findfirst64i32(fileName.c_str(),&fileInfo);
- if(handle==-1)
- {
- cout<<"该目录为空!"<<endl;
- //cin.get();
- return -1;
- }
- do
- {
- // cout<<"查找成功"<<endl;
- // cin.get();
- // cout<<fileInfo.name<<endl;
- //如果是文件夹".",或者"..",则进行判断下一个文件
- if((strcmp(fileInfo.name,".")==0)|(strcmp(fileInfo.name,"..")==0))
- {
- //cout<<"丢弃!"<<endl;
- //cin.get();
- continue;
- }
- //如果是文件夹,则进入下一层文件夹搜索
- if((fileInfo.attrib&_A_SUBDIR)==_A_SUBDIR)
- {
- // cout<<"是文件夹"<<endl;
- // cin.get();
- string filePathSub=filePath+"\\"+fileInfo.name;
- //递归调用
- searchAllFile(filePathSub,++layer,fileInfoOut);
- layer--;
- }
- //把搜集到的信息连接到文件
- else
- {
- // cout<<"是文件,存储信息!"<<endl;
- // cin.get();
- counter++;
- string fileNameTure=filePath+"\\"+fileInfo.name;
- saveToLink(head,fileNameTure,fileInfo); //存储到链表中
- }
- }while(!(done=_findnext64i32(handle,&fileInfo)));
- _findclose(handle);
- //layer==时,完成链表的存储
- if(layer==0)
- {
- //显示链表中的内容
- displayLink(head);
- //存储链表中的内容
- saveLinkToFile(head,fileInfoOut,counter);
- }
- return 0;
- }
posted @
2015-10-05 15:16
紫旭
阅读(
594)
评论()
编辑
收藏
举报