当前位置: 技术问答>linux和unix
求助,遍历目录中所有文件的代码分析
来源: 互联网 发布时间:2016-07-18
本文导语: 如下代码, 希望罗列出pszBaseDir目录下的所有文件。 这些文件都是普通的文本文件。 struct dirent* ent = NULL; DIR *pDir; struct stat statbuf; if( (pDir=opendir(pszBaseDir)) == NULL...
如下代码,
希望罗列出pszBaseDir目录下的所有文件。
这些文件都是普通的文本文件。
但,上述代码的结果是,
列出的文件不全!
而且似乎跟文件名有关(改一下文件名就能列出)。
请教,该如何正确罗列出目录下的文件。
谢谢!!
希望罗列出pszBaseDir目录下的所有文件。
这些文件都是普通的文本文件。
struct dirent* ent = NULL;
DIR *pDir;
struct stat statbuf;
if( (pDir=opendir(pszBaseDir)) == NULL)
{
printf("open dir %s failedn", pszBaseDir);
return false;
}
while( (ent=readdir(pDir)) != NULL )
{
if(ent->d_reclen == 24) //
{
if(ent->d_type == 8) //文件,结果列出的不全!
{
string strFilePath = strDir;
strFilePath += ent->d_name;
vFiles.push_back(strFilePath); //将文件名放入容器中
}
else
{
string strSubDir = strDir;
strSubDir += ent->d_name;
}
}
else if(ent->d_reclen == 16) //
{
}
}
closedir(pDir);
但,上述代码的结果是,
列出的文件不全!
而且似乎跟文件名有关(改一下文件名就能列出)。
请教,该如何正确罗列出目录下的文件。
谢谢!!
|
我觉得是if(ent->d_reclen == 24)使输出的文件不全,我试了一下,各种长度的都有,普通文件也可以有不同的dirent结构长度,所以去掉这个条件应该就能列全了
|
struct dirent {
ino_t d_ino; /* inode number */
off_t d_off; /* offset to the next dirent */
unsigned short d_reclen; /* length of this record */
unsigned char d_type; /* type of file; not supported
by all file system types */
char d_name[256]; /* filename */
};
d_reclen就是dirent结构的长度.你想d_name不同,自然结构长度就不同,我的上面
是先对d_name的长度进行4字节补齐,然后加上12,就算d_reclen,所以d_reclen
一般是根据文件名长度变化而变化的,但都是4的倍数.
ino_t d_ino; /* inode number */
off_t d_off; /* offset to the next dirent */
unsigned short d_reclen; /* length of this record */
unsigned char d_type; /* type of file; not supported
by all file system types */
char d_name[256]; /* filename */
};
d_reclen就是dirent结构的长度.你想d_name不同,自然结构长度就不同,我的上面
是先对d_name的长度进行4字节补齐,然后加上12,就算d_reclen,所以d_reclen
一般是根据文件名长度变化而变化的,但都是4的倍数.
|
不知怎么的,DEV-C++竟然说我的struct dirent没有d_type成员!
我在windows下写的,测试通过,功能只是打印文件名(根据你说的没有二级目录,所以就没有考虑文件夹的情况),希望对你有帮助~
我在windows下写的,测试通过,功能只是打印文件名(根据你说的没有二级目录,所以就没有考虑文件夹的情况),希望对你有帮助~
#include
#include
void printdir(char *dir)
{
DIR *dp;
struct dirent *entry;
if((dp = opendir(dir)) == NULL) {
printf("cannot open directory: %sn", dir);
return;
}
chdir(dir);
while((entry = readdir(dp)) != NULL) {
printf("%sn",entry->d_name);
}
closedir(dp);
}
int main()
{
printf("Files are :n");
printdir("D:\mulu");//D盘根目录下有mulu文件夹
printf("done.n");
exit(0);
}
|
while((ent = readdir(dir))!=NULL)
{
printf(“d_name: %sn”,ent->d_name);
}