zoukankan      html  css  js  c++  java
  • Linux下C语言获取目录中的文件列表

    LinuxC语言获取目录中的文件列表

    分类:编程语言

    代码如下: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 ", 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为无效的目录流

  • 相关阅读:
    docker
    算法学习 —— 动态规划练习(二)
    算法学习 —— 动态规划练习(一)
    算法学习——动态规划讲解
    Java核心复习——CompletableFuture
    Java源码阅读(八)—— ThreadPoolExecutor
    Java源码阅读(三)—— ThreadLocal
    TensorFlow实现XOR
    实现逻辑回归-神经网络
    深度学习之Numpy整理
  • 原文地址:https://www.cnblogs.com/dgwblog/p/12158373.html
Copyright © 2011-2022 走看看