Linux下C语言获取目录中的文件列表

来源:互联网 发布:网络广告制作软件 编辑:程序博客网 时间:2024/05/01 15:08


分类:编程语言

代码如下:Linux下使用GCC 编译即可

 

#include <sys/types.h>

#include <dirent.h>

#include <unistd.h>

#include <stdio.h>

 

int main(){

   DIR    *dir;

   struct    dirent    *ptr;

   

   dir = opendir("/home/zhangyang/kmeans");

   

   while((ptr = readdir(dir)) != NULL)

       printf("d_name: %s\n", ptr->d_name);

 

   closedir(dir);

   return 0;

}

 

注意:假设要读取的目录中有多个文件,文件名分别为:1.bin, 2.bin, 3.bin,.....99.bin等

     程序的读取顺序是这样的:1.bin, 10.bin, 11.bin,....19.bin, 2.bin,       

     20.bin,...,29.bin,....99.bin

     而不是我们所期望的1.bin, 2.bin, 3.bin,.....99.bin,可见文件的读取顺序是与文件名有关系的

 

如果想判断是否为文件夹或者文件,则可以使用如下代码:

struct stat info;

stat(path,&info);

if(S_ISDIR(info.st_mode))

   printf("This is a directory");

stat结构及其域如下所示:

         struct stat {

              dev_t     st_dev;    /* ID of device containing file */

              ino_t     st_ino;    /* inode number */

              mode_t    st_mode;   /* protection */

              nlink_t   st_nlink;  /* number of hard links */

              uid_t     st_uid;    /* user ID of owner */

              gid_t     st_gid;    /* group ID of owner */

              dev_t     st_rdev;   /* device ID (if special file) */

              off_t     st_size;   /* total size, in bytes */

              blksize_t st_blksize; /*blocksize for filesystem I/O */

              blkcnt_t  st_blocks; /* number of blocks allocated */

              time_t    st_atime;  /* time of last access */

              time_t    st_mtime;  /* time of last modification */

              time_t    st_ctime;  /* time of last status change */

         };

如下的Posix宏用于检测st_mode域的文件类型:

S_ISREG()  regular file?

S_ISDIR()  directory?

S_ISCHR()  character device?

S_ISBLK()  block device?

S_ISFIFO() FIFO (named pipe)?

S_ISLNK()  symbolic link?

S_ISSOCK() socket?

 

注释:代码中的opendir函数和readdir函数如下所示:

 

opendir(打开目录)

相关函数

 

open,readdir,closedir,rewinddir,seekdir,telldir,scandir

 

表头文件

 

#include<sys/types.h>

#include<dirent.h>

 

定义函数

 

DIR * opendir(const char * name);

 

函数说明

 

opendir()用来打开参数name指定的目录,并返回DIR*形态的目录流,和open()类似,接下来对目录的读取和搜索都要使用此返回值。

 

返回值

 

成功则返回DIR* 型态的目录流,打开失败则返回NULL。

 

错误代码

 

EACCESS 权限不足

EMFILE 已达到进程可同时打开的文件数上限。

ENFILE 已达到系统可同时打开的文件数上限。

ENOTDIR 参数name非真正的目录

ENOENT 参数name 指定的目录不存在,或是参数name为一空字符串。

ENOMEM 核心内存不足。

 

readdir(读取目录)

 

相关函数

 

open,opendir,closedir,rewinddir,seekdir,telldir,scandir

 

表头文件

 

#include<sys/types.h>

#include<dirent.h>

 

定义函数

 

struct dirent * readdir(DIR * dir);

 

函数说明

 

readdir()返回参数dir目录流的下个目录进入点。

结构dirent定义如下

struct dirent

{

ino_t d_ino;

ff_t d_off;

signed short int d_reclen;

unsigned char d_type;

har d_name[256];

};

d_ino 此目录进入点的inode

d_off 目录文件开头至此目录进入点的位移

d_reclen _name的长度,不包含NULL字符

d_type d_name 所指的文件类型

d_name 文件名

 

返回值

 

成功则返回下个目录进入点。有错误发生或读取到目录文件尾则返回NULL。

 

附加说明

 

EBADF参数dir为无效的目录流




转自:http://wenku.baidu.com/link?url=roA6RqTWc4lKx67AXlR0qRI2vqFvrCcxy0G2zN3Bidqn3QyXay0Y4by8GGTuZS7j9F0_ZF9gMExCV9QK12Ow_mVVo60UTl8zYoBijZeudwa

0 0
原创粉丝点击