C++获取某路径下文件名
最近在做一个项目,涉及到需要对文本进行处理!如果逐个处理文本,那样做比较费时,如果能把某个文件夹下的文件(也可能包括子文件夹)以列表的形式展示出来,并包括路径,那处理起来就相对容易了!上网搜了一下,借鉴一下该文http://blog.sina.com.cn/s/blog_670d5f330100lqnm.html,在该文的基础上稍作修改,并简要介绍相关数据结构!
首先,介绍一下相关数据结构。要获取文件夹下面文件的名称,那么就需要对文件的结构有所了解。
struct _finddata_t 是用来存储文件各种信息的结构体,包含于io.h头文件中。定义如下:
struct _finddata_t { unsigned attrib; time_t time_create; //文件的创建时间 time_t time_access; //文件最后一次的访问时间 time_t time_write; //文件最后一次的写入时间 _fsize_t size; //文件的大小 char name[_MAX_FNAME]; //文件名 _MAX_FNAME,为文件名长度 };
其中各成员变量的含义如下:unsigned attrib:文件属性的存储位置。它存储一个unsigned单元,用于表示文件的属性。文件属性是用位表示的,主要有以下一些:_A_ARCH(存档)_A_HIDDEN(隐藏)_A_NORMAL(正常)_A_RDONLY(只读)_A_SUBDIR(文件夹)_A_SYSTEM(系统)
这些都是在头文件中定义的宏,可以直接使用,而本身的意义其实是一个无符号整型(只不过这个整型应该是2的几次幂,从而保证只有一位为1,而其他位为0)。既然是位表示,那么当一个文件有多个属性时,它往往是通过位或的方式,来得到几个属性的综合。例如只读+隐藏+系统属性,应该为:_A_HIDDEN | _A_RDONLY | _A_SYSTEM 。具体的值如下:
#define _A_NORMAL 0x00 /* Normal file - No read/write restrictions */ #define _A_RDONLY 0x01 /* Read only file */ #define _A_HIDDEN 0x02 /* Hidden file */ #define _A_SYSTEM 0x04 /* System file */ #define _A_SUBDIR 0x10 /* Subdirectory */ #define _A_ARCH 0x20 /* Archive file */
对基本的数据结构有所了解之后,我们就来实战一下,借鉴博主开篇说的那篇文章,但本文对此代码稍作修改。
#include #include #include #include #include #include #include using namespace std; void getFiles( string, vector & ); int main() { vector files; char *path=new char[64]; memset(path,0,64); cout<<"请输入文件路径: "< & files) { //文件句柄 long handle_file = 0; //文件信息 struct _finddata_t file_info; string p; if((handle_file = _findfirst(p.assign(path).append("\\*").c_str(),&file_info)) != -1) { while(_findnext(handle_file, &file_info) == 0) { //如果是目录,迭代之 //如果不是,加入列表 if ((file_info.attrib & _A_SUBDIR)) { if(strcmp(file_info.name,".") != 0 && strcmp(file_info.name,"..") != 0) { getFiles( p.assign(path).append("\\").append(file_info.name), files); if(file_info.attrib!=_A_SUBDIR) files.push_back(p.assign(path).append("\\").append(file_info.name)); } } else { files.push_back(p.assign(path).append("\\").append(file_info.name)); } } _findclose(handle_file); } }
Windows平台下VS2010已测试通过!
参考资料: