dirent.h是用于目录操作的头文件,linux 默认在/usr/include目录下(会自动包含其他文件),常见的方法如下:
1. opendir()
打开目录,并返回句柄
2. readdir()
读取句柄,返回dirent结构体
3. telldir()
返回当前指针的位置,表示第几个元素
4. close()
关闭句柄
不同平台下的dirent 结构体各异,如mac:
struct dirent {
ino_t d_ino; /* file number of entry */
__uint16_t d_reclen; /* length of this record */
__uint8_t d_type; /* file type, see below */
__uint8_t d_namlen; /* length of string in d_name */
char d_name[__DARWIN_MAXNAMLEN + 1]; /* name must be no longer than this */
};
其中:d_name表示文件名称, d_type表示文件类型,类型如下:
enum
{
DT_UNKNOWN = 0,
# define DT_UNKNOWN DT_UNKNOWN
DT_FIFO = 1,
# define DT_FIFO DT_FIFO
DT_CHR = 2,
# define DT_CHR DT_CHR
DT_DIR = 4,
# define DT_DIR DT_DIR
DT_BLK = 6,
# define DT_BLK DT_BLK
DT_REG = 8,
# define DT_REG DT_REG
DT_LNK = 10,
# define DT_LNK DT_LNK
DT_SOCK = 12,
# define DT_SOCK DT_SOCK
DT_WHT = 14
# define DT_WHT DT_WHT
};
范例代码如下:
/*
============================================================================
Name : hell_c.c
Author : yuancj
Version :
Copyright : Your copyright notice
Description : Hello World in C, Ansi-style
============================================================================
*/
#include <stdio.h>
#include <stddef.h>
#include <dirent.h>
int main(int argc, char * argv[]) {
DIR * dp;
struct dirent * dirp;
if (argc != 2) {
printf("usage: ls directory_name");
}
if ( (dp = opendir(argv[1])) == NULL) {
printf("can't open %s", argv[1]);
}
while ( (dirp = readdir(dp)) != NULL ) {
printf("name:%s-type:%d-position:%ld\n", dirp->d_name, dirp->d_type, telldir(dp));
}
closedir(dp);
return 0;
}