2012年(11)
分类: C/C++
2012-11-06 16:13:00
Linux下遍历输出目录下的文件
在Linux下opendir()、readdir()和closedir()这三个函数主要用来遍历目录。在使用这三个函数前必须先包括以下两个头文件:
#include
#include
1.Readdir()函数原型:
#include
#include
DIR * opendir(const char * name);
函数说明:opendir()用来打开参数name指定的目录,并返回DIR*形态的目录流,和open()类似,接下来对目录的读取和搜索都要使用此返回值。
函数返回值: 成功则返回DIR* 型态的目录流,打开失败则返回NULL。
错误代码:
EACCESS 权限不足
EMFILE 已达到进程可同时打开的文件数上限。
ENFILE 已达到系统可同时打开的文件数上限。
ENOTDIR 参数name非真正的目录
ENOENT 参数name 指定的目录不存在,或是参数name 为一空字符串。
ENOMEM 核心内存不足
结构体DIR原型:
typedef struct __dirstream DIR;
struct __dirstream
{
void *__fd; /* `struct hurd_fd' pointer for descriptor. */
char *__data; /* Directory block. */
int __entry_data; /* Entry number `__data' corresponds to. */
char *__ptr; /* Current pointer into the block. */
int __entry_ptr; /* Entry number `__ptr' corresponds to. */
size_t __allocation; /* Space allocated for the block. */
size_t __size; /* Total valid data in the block. */
__libc_lock_define (, __lock) /* Mutex lock for this structure. */
};
2.Readdir()函数原型:
#include
#include
struct dirent *readdir(DIR *dir)
函数说明: readdir()返回参数dir目录流的下个目录进入点。
函数返回值:成功则返回下个目录进入点。有错误发生或读取到目录文件尾则返回NULL
结构dirent定义如下:
Struct dirent
{
ino_t d_ino; //此目录进入点的inode
ff_t d_off; //目录文件开头到此目录进入点的位移
signed short int d_reclem; //_name的长度,不包含NULL字符
unsigned char d_type; // d_name所指的文件类型
char d_name[256]; //文件名
}
3. closedir(DIR *dir)函数的原型:
int closedir(DIR *dir);
这个函数就不用多说了,一般有开(open),就有关(close),这样的结构经常可出看到,如fopen,fclose等等。
4.源码示例:
#include
#include
int main( int argc, char *argv[] )
{
struct dirent *pDirEntry = NULL;
DIR *pDir = NULL;
if( (pDir = opendir("/root/")) == NULL )
{
printf("opendir failed!\n");
return 1;
}
else
{
while( pDirEntry = readdir(pDir) )
{
printf("索引节点:%d\t 偏移量:%d\t 文件名长:%d\t文件类型:%d\t 文件名:%s\n",
pDirEntry->d_ino, pDirEntry->d_off,
pDirEntry->d_reclen,pDirEntry->d_type,pDirEntry->d_name);
}
closedir(pDir);
return 0;
}
}