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(打開目錄)
相關函數
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為無效的目錄流