全部博文(343)
分类: LINUX
2008-05-21 17:17:43
Q:大家好,我现在遇到一个问题,就是要在一个文件夹下面搜索,判断该文件夹下面的文件是不是文件夹;我以前的做法如下:
struct stat statbuf;
if (lstat(pathname,&statbuf) <0){//pathname是文件名的绝对路径
printf("lstate error %d\n",errno);
return -errno;
}
if (S_ISDIR(statbuf.st_mode) ==0){就不是文件夹
}
上面代码文件不是很多的情况下,是可行的,一旦文件多啦,就非常的慢!
请问各位,是否有提高速度的方法呢??
请高手们指点啊!
A: 用opendir吧, 不过由于d_type成员不是每个操作系统都提供, 不具有移植性.
为了性能, 这也是无奈之举. 没有实际测试过, 不过据俺了解, 在大多数Unix系统上lstat, stat, fstat都是系统调用, 而readdir是库函数, 所做的操作只是在DIR *dirp链表中取下一项, 开销上的差别可想而知.
/*
* File: isdir.c
* Date: 2008-03-14
* Auth: mymtom
*/
#include
#include
#include <string.h>
#include
#include
#ifndef DT_DIR
#error "DT_DIR not defined, maybe d_type not a mumber of struct dirent!"
#endif
int
main(int argc, char *argv[])
{
static char dot[] = ".", dotdot[] = "..";
const char *name;
DIR *dirp;
struct dirent *dp;
if (argc == 2)
name = argv[1];
else
name = dot;
dirp = opendir(name);
if (dirp == NULL) {
(void)fprintf(stderr, "%s: opendir(): %s: %s\n",
argv[0], name, strerror(errno));
exit(errno);
}
while ((dp = readdir(dirp)) != NULL) {
if (dp->d_type == DT_DIR)
if ( strcmp(dp->d_name, dot)
&& strcmp(dp->d_name, dotdot) )
(void)printf("%s/\n", dp->d_name);
}
(void)closedir(dirp);
return (0);
}