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

代码如下: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
(打开目录)

相关函数

openreaddirclosedirrewinddirseekdirtelldirscandir

表头文件

#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
(读取目录)

相关函数

openopendirclosedirrewinddirseekdirtelldirscandir

表头文件

#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为无效的目录流。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值