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\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為無效的目錄流


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM