我编写了一个函数来重命名目录中的文件,以便以数字顺序命名它们。不幸的是,这个函数似乎丢弃了一些文件并重命名了一些文件。可能,我不理解readdir()和rename()背后的逻辑。任何人都可以提供帮助,这是我的代码的摘录;
while(((entry->readdir(dirp))!=NULL)
{
strcpy(t1_string,entry->d_name);
exception1=strcmp(entry->d_name,".");
exception2=strcmp(entry->d_name,"..");
exception3=strcmp(entry->d_name,".svn");
if((exception1!=0)&&(exception2!=0)&&(exception3!=0))
{
token2=strchr(t1_string,'.'); //extension part
num_files++;
if(num_files%4==1)
utt++;
sprintf(utt_n,"%d",utt);
strcpy(newfilename, utt_s); //utt_s is a constant string
strcat(newfilename,utt_n);
strcat(newfilename,token2);
rename(entry->d_name,newfilename);
}
} //End of the while loop
答案 0 :(得分:2)
这很可能是由于竞争条件造成的;您在迭代数据结构时实质上修改了数据结构。当然,数据结构是文件系统对目录中文件名称的概念。
正如评论中所指出的那样,在readdir()
的Open Group的规范页面中,甚至会对此确切情况发出警告:
如果在最近一次调用
opendir()
或rewinddir()
后从目录中删除或添加了文件,则后续调用readdir()
是否返回该文件的条目未指定
更好的方法是分两个阶段完成:
当然,您必须为重命名失败做好准备,因为其他进程可以与您并行重命名或删除文件。