Linux下C++获取目录下文件名

C++获取目录下文件名(Windows/Linux下)

Linux下获取目录下文件名

在编码解决这个问题之前,先介绍下DIR,dirent,stat等结构体。

DIR结构体

DIR结构体胡定义如下:

struct  __dirstream
{
    void   *__fd;
    char  *__data;
    int      __entry_data;
    char   *__ptr;
    int     __entry_ptr;
    size_t  __allocation;
    size_t  __size;
    __libc_lock_define (, __lock)
};
typedef struct __dirstream DIR;

DIR结构体类似于FILE,是一个内部结构,以下几个函数用这个内部结构保存当前正在被读取的目录的有关信息(摘自《UNIX环境高级编程(第二版)》)。函数 DIR *opendir(const char *pathname),即打开文件目录,返回的就是指向DIR结构体的指针,而该指针由以下几个函数使用:

struct  dirent *readdir(DIR *dp);
void rewinddir(DIR *dp);
int closedir(DIR *dp);
long telldir(DIR *dp);
void seekdir(DIR *dp,long loc);

关于DIR结构,我们知道这么多就可以了,没必要去再去研究他的结构成员。

这种文件包含了其他文件的名字以及指向与这些文件有关的信息的指针(摘自《UNIX环境高级编程(第二版)》)。从定义能够看出,dirent不仅仅指向目录,还指向目录中的具体文件,readdir函数同样也读取目录下的文件,这就是证据。以下为dirent结构体的定义:

struct dirent
{
long d_ino; //inode number 索引节点号
off_t d_off;  //offset to this dirent 在目录文件中胡偏移
unsigned short d_reclen;  //length of this d_name 文件名长 
unsigned char d_type; /* the type of d_name 文件类型 */
char d_name [NAME_MAX+1]; /* file name (null-terminated) 文件名,最长255字符 */
}

从上述定义也能够看出来,dirent结构体存储的关于文件的信息很少,所以dirent同样也是起着一个索引的作用,如果想获得类似ls -l那种效果的文件信息,必须要靠stat函数了。

通过readdir函数读取到的文件名存储在结构体dirent的d_name成员中,而函数
int stat(const char *file_name, struct stat *buf);
的作用就是获取文件名为d_name的文件的详细信息,存储在stat结构体中。以下为stat结构体的定义:

struct stat {
mode_t     st_mode;       //文件访问权限
ino_t      st_ino;       //索引节点号
dev_t      st_dev;        //文件使用的设备号
dev_t      st_rdev;       //设备文件的设备号
nlink_t    st_nlink;      //文件的硬连接数
uid_t      st_uid;        //所有者用户识别号
gid_t      st_gid;        //组识别号
off_t      st_size;       //以字节为单位的文件容量
time_t     st_atime;      //最后一次访问该文件的时间
time_t     st_mtime;      //最后一次修改该文件的时间
time_t     st_ctime;      //最后一次改变该文件状态的时间
blksize_t st_blksize;    //包含该文件的磁盘块的大小
 blkcnt_t   st_blocks;     //该文件所占的磁盘块
 }

这个记录的信息就很详细了。
最后,总结一下,想要获取某目录下(比如a目下)b文件的详细信息,我们应该怎样做?

首先,我们使用opendir函数打开目录a,返回指向目录a的DIR结构体c。

接着,我们调用readdir( c)函数读取目录a下所有文件(包括目录),返回指向目录a下所有文件的dirent结构体d。
然后,我们遍历d,调用stat(d->name,stat *e)来获取每个文件的详细信息,存储在stat结构体e中。
总体就是这样一种逐步细化的过程,在这一过程中,三种结构体扮演着不同的角色。
下面具体介绍使用实例吧。使用到的目录结构如下:

-test
--testDirector_1
---testDirector_1_test_1.txt
---testDirector_2_test_1.txt
---testDirector_3_test_1.txt
--testDirector_2
--testDirector_3
--test_text_1.txt
--test_text_2.txt
--test_text_3.txt
--1_999_v1.cms
#include <sys/types>
#include <dirent.h>
#include <stdio.h>
#include <errno>
#include <stdlib.h>
using namespace std;
#define PATH “./test/"
int scanDirectorFromPath(const char* path)
{
	DIR *dir;
	dir = opendir(path);
	if(dir == NULL){
        cout<<"Open Dir failed!"<<endl;
        return -1;
    }
    struct dirent *dirent_;
    while(dirent_ = readdir(dir))
    {
		string dir_name = dirent_ ->d_name;
		//ignore . or .. file
		if(dir_name  == "." || dir_name  == ".."){
		    continue;
		}else is (dir_name .find(”.cms“) != string::npos){
            size_t start_pos = dir_name.find_first_of("_");
            int appID = atoi(dir_name.substr(0,start_pos ).c_str());
            size_t end_pos = dir_name.find_last_of("_");
            int orgID = atoi(dir_name.substr(start_pos +1,end_pos ).c_str());
            cout<< "CMS File‘s appID:"<<appID <<endl;
            cout<< "CMS File‘s orgID:"<<orgID <<endl;
        }
		cout<< " File‘s Name:"<<dir_name <<endl;
    }
}
int main()
{
	scanDirectorFromPath(PATH);
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值