LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 991|回复: 9

readdir出错

[复制链接]
发表于 2009-1-2 22:33:08 | 显示全部楼层 |阅读模式
这是段函数的作用是扫描文件夹和子文件夹里的mp3,wma,flac文件,并打印在屏幕上,但总是出错。
每次段错误都出在“dir_ent=readdir(dir);”,我试过把出错目录里的文件删除了几个,但是程序扫描了一回后又出错了。

void openfile(char *filename_)
{
    char filename[128];
    DIR *dir;
    struct dirent *dir_ent;
    dir=opendir(filename_);
    while(TRUE)
    {
        dir_ent=readdir(dir);
        if(dir_ent==NULL)break;
        if(!strcmp(dir_ent->d_name,"..")||!strcmp(dir_ent->d_name,"."))continue;
        strcpy(filename,filename_);
        strcat(filename,"/");
        strcat(filename,dir_ent->d_name);
        struct stat buf;
        stat(filename,&buf);
        if(S_ISDIR(buf.st_mode))openfile(filename);
        else
        if(
                      !strcmp(filename+strlen(filename)-4,".mp3")||
                !strcmp(filename+strlen(filename)-4,".wma")||
                !strcmp(filename+strlen(filename)-5,".flac")
                )
                printf("%s\n",filename);
    };
}
发表于 2009-1-2 23:52:41 | 显示全部楼层
while(TRUE)?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-1-3 00:09:02 | 显示全部楼层
while(TRUE)死循环,“if(dir_ent==NULL)break;”这个时候才退出
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-1-3 00:11:25 | 显示全部楼层
这样写可能比较容易理解一点
void openfile(char *filename_)
{
char filename[128];
DIR *dir;
struct dirent *dir_ent;
dir=opendir(filename_);
for(dir_ent=readdir(dir);dir_ent!=NULL;dir_ent=readdir(dir))
{
if(!strcmp(dir_ent->d_name,"..")||!strcmp(dir_ent->d_name,"."))continue;
strcpy(filename,filename_);
strcat(filename,"/");
strcat(filename,dir_ent->d_name);
struct stat buf;
stat(filename,&buf);
if(S_ISDIR(buf.st_mode))openfile(filename);
else
if(
!strcmp(filename+strlen(filename)-4,".mp3")||
!strcmp(filename+strlen(filename)-4,".wma")||
!strcmp(filename+strlen(filename)-5,".flac")
)
printf("%s\n",filename);
};
}
回复 支持 反对

使用道具 举报

发表于 2009-1-3 00:22:47 | 显示全部楼层
帮LZ试了下,没有问题啊。莫非你测试的目录相当庞大..?或者有诡异的文件名?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-1-3 00:29:19 | 显示全部楼层
不是测试题目。。我想给我自己做一个简单的音乐播放器来着。我的音乐文件夹里目录最深有5层,大概500多首歌。前几天我做过这个程序,当时扫描目录成功了,但播放音乐的时候很麻烦,我一气之下就把代码删了。现在倒做不出来了。。。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-1-3 00:32:13 | 显示全部楼层
我把这个函数单独分出来,编译成了一个小程序,貌似有点头绪了。。。。

wind@wind-desktop:/windows/D/Music/Rise Against/Siren Song Of The Counter Culture> ~/a.out /windows/D/Music/Rise Against/Siren Song Of The Counter Culture
wind@wind-desktop:/windows/D/Music/Rise Against/Siren Song Of The Counter Culture> ~/a.out '/windows/D/Music/Rise Against/Siren Song Of The Counter Culture'
段错误
wind@wind-desktop:/windows/D/Music/Rise Against/Siren Song Of The Counter Culture> ~/a.out .
./01-rise_against-state_of_the_union-kzt.mp3
./02-rise_against-the_first_drop-kzt.mp3
./03-rise_against-life_less_frightening-kzt.mp3
./04-rise_against-paper_wings-kzt.mp3
./05-rise_against-blood_to_bleed-kzt.mp3
./06-rise_against-to_them_these_streets_belong-kzt.mp3
./07-rise_against-tip_the_scales-kzt.mp3
./08-rise_against-anywhere_but_here-kzt.mp3
./09-rise_against-give_it_all-kzt.mp3
./10-rise_against-dancing_for_rain-kzt.mp3
./11-rise_against-swing_life_away-kzt.mp3
./12-rise_against-rumors_of_my_demise_have_been_greatly_exaggerated-kzt.mp3
wind@wind-desktop:/windows/D/Music/Rise Against/Siren Song Of The Counter Culture>
回复 支持 反对

使用道具 举报

发表于 2009-1-3 00:41:50 | 显示全部楼层
filename[128]?数组开的不够大?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-1-3 00:45:23 | 显示全部楼层
果然。。。换成filename[256]就可以了。调试的时候错误都出现在“dir_ent=readdir(dir);”这一行。。。怎么会和filename有关系呢。。。。诡异。。诡异。。
回复 支持 反对

使用道具 举报

发表于 2009-1-3 12:50:07 | 显示全部楼层
一眼扫过去没注意到break,呵呵
我碰到要用文件名,一律用char[256],反正linux下和windows下文件名带路径最大都不超过255
PS:贴代码的话前后加[code][/code]好看一点
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表