1.首先要打开目录文件
DIR *opendir( const char *name);
DIR *fdopendir( int fd);
2.读取目录文件信息的函数
注意:这是个库函数
struct dirent *readdir( DIR *dirp);
int readdir_r( DIR *dirp, struct dirent *entry, struct dirent **result);
文件目录结构体:
struct dirent {
ino_t d_ino; /* inode number 索引节点号*/
off_t d_off; /* not an offset; see NOTES 在目录文件中的偏移*/
unsigned short d_reclen; /* length of this record 文件名长*/
unsigned char d_type; /*type of file; not supported by all filesystem types 文件类型*/
char d_name[256]; /* filename 文件名,最长255字符*/
};
d_type的值为:
- 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.
readdir()函数实例:
注意:
每次使用readdir后,readdir会读到下一个文件,readdir是依次读出目录中的所有文件,每次只能读一个
这个特性和readdir_r()一样
#include <stdio.h>
#include <sys/types.h>
#include <dirent.h>
int main(int argc, char **argv)
{
DIR *pDir = NULL;
struct dirent * pEnt = NULL;
unsigned int cnt = 0;
if (argc != 2)
{
printf("usage: %s dirname\n", argv[0]);
return -1;
}
pDir = opendir(argv[1]);
if (NULL == pDir)
{
perror("opendir");
return -1;
}
while (1)
{
pEnt = readdir(pDir);
if(pEnt != NULL)
{
if (pEnt->d_type == DT_REG)
{
printf("是普通文件:");
}
else
{
printf("不是普通文件:");
}
printf("name:[%s] \n", pEnt->d_name);
cnt++;
}
else
{
break;
}
};
printf("总文件数为:%d\n", cnt);
return 0;
}
结果:
$ ./a.out .
是普通文件:name:[a.c]
不是普通文件:name:[.]
不是普通文件:name:[..]
是普通文件:name:[a.out]
不是普通文件:name:[12_sr]
不是普通文件:name:[10_sr]
不是普通文件:name:[17_sr]
不是普通文件:name:[15_sr]
不是普通文件:name:[14.sr]
不是普通文件:name:[18_sr]
不是普通文件:name:[udp]
不是普通文件:name:[16_sr]
不是普通文件:name:[tcp]
总文件数为:13
C++
#include <iostream>
#include <string>
using namespace std;
#include <sys/types.h>
#include <fcntl.h>
#include <unistd.h>
#include <dirent.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <dirent.h>
void search(string commonXmlPath){
{
string ectPath = commonXmlPath;
string subDistrictXmlPath;
DIR* dir_pointer = opendir(ectPath.c_str());
if (!dir_pointer)
return;
for (dirent* dp = readdir(dir_pointer); dp != NULL; dp = readdir(dir_pointer))
{
std::string filename = dp->d_name;
if (filename == "." || filename == "..")
{
continue;
}
if (dp->d_type == 8)//?录镁
{
int split = filename.find('.');
if (split == -1)
continue;
string pp = ectPath + filename;
cout << pp.c_str() <<"\n";
}
if(dp->d_type == 4)//目录拢卢?么录?酶碌梅 {
//每赂枚募镁录?路戮露
subDistrictXmlPath = ectPath + string("/") + dp->d_name;
search(subDistrictXmlPath);
}
}
//closedir(dir_pointer);
}
int main(){
search(string("/data/home/android/configserver/common_xmls/etc"));
return 0;
}
readdir_r():
注意:
这三个参数
#include <stdio.h>
#include <sys/types.h>
#include <dirent.h>
#include <stdlib.h>
int main(int argc, char **argv)
{
DIR *pDir = NULL;
struct dirent * pEnt = NULL;
struct dirent *entry = (struct dirent *)malloc(sizeof(struct dirent));
struct dirent **result = (struct dirent **)malloc(sizeof(struct dirent));
unsigned int cnt = 0;
unsigned int ret = 0;
if (argc != 2)
{
printf("usage: %s dirname\n", argv[0]);
return -1;
}
pDir = opendir(argv[1]);
if (NULL == pDir)
{
perror("opendir");
return -1;
}
ret = readdir_r(pDir , entry , result);
printf("return :%d \n", ret);
printf("name :[%s] \n", entry->d_name);
printf("name :[%s] \n", result[0]->d_name);
ret = readdir_r(pDir , entry , result);
printf("return :%d \n", ret);
printf("name :[%s] \n", entry->d_name);
printf("name :[%s] \n", result[0]->d_name);
return 0;
}
结果: