作者: Sam (甄峰) sam_code@hotmail.com
在Linux下得到某目录下文件和文件夹信息,可以采用如下系列函数:
0. DIR系列库函数:
0.1:DIR *opendir(const char *name);
opendir()函数打开一个目录名所对应的目录流。并返回指向目录流的指针。流定位在目录流的第一个条目。
(Sam: 其实和Open()一样,只不过Open打开的是文件流,流定位于文件头)
如果打开流失败,则返回空。如果成功,则返回类似句柄的DIR指证。后面几乎所有
0.2:int closedir(DIR *dirp);
关闭DIR流。
0.3:struct dirent *readdir(DIR *dirp);
从DIR流中读取一个项目,返回的是一个指证,指向dirent结构体. 且流的自动指向下一个目录条目。
如果已经到流的最后一个条目,则返回NULL。
dirent 结构如下:
struct dirent {
ino_t d_ino;
off_t d_off;
unsigned short d_reclen;
unsigned char
d_type;
char d_name[256];
};
其中,Type包括以下类型(但只有Btrfs, ext2, ext3, and ext4支持):
DT_BLK This is a block device.
DT_CHR This is a character device.
DT_DIR This is a directory.
DT_FIFO This is a named pipe (FIFO).
DT_LNK This is a symbolic link.
DT_REG This is a regular file.
DT_SOCK This is a UNIX domain socket.
DT_UNKNOWN The file type is
unknown.
0.4: long telldir(DIR *dirp);
返回当前DIR流相对于流头的offset.
0.5: void seekdir(DIR *dirp, long
offset);
设置DIR流下次readdir 的偏移位置。
0.7:void rewinddir(DIR *dirp);
设置DIR流当前位置到流头。
1. 实例:
1.1:实例一,遍历指定目录下的所有文件。并输出文件信息:
DIR* dfd;
char deviceDir[128] = {0};
struct dirent* pDirent;
strcpy(deviceDir, "/dev/input/");
dfd = opendir(deviceDir);
if(dfd == NULL)
return INPUT_EVENT_DIR_ERR;
while((pDirent = readdir(dfd)) != NULL)
{
printf("\nFile Name:[%s]. Type:[%d]\n",
pDirent->d_name,
pDirent->d_type);
}
closedir(dfd);
注意:opendir(), closedir(), readdir(),telldir(),
seekdir()均是glibc提供。即在libc.so.6中实现。
但请注意,Android NDK截至到R8C,还未提供telldir(),seekdir()等。 但opendir(), closedir(),
readdir()则正常提供了。
但因为众所周知的原因,blogspot经常无法使用。Sam只好把blog移到sina了。