readdir()如何与rename()一起使用?

时间:2015-05-04 11:15:48

标签: c

我编写了一个函数来重命名目录中的文件,以便以数字顺序命名它们。不幸的是,这个函数似乎丢弃了一些文件并重命名了一些文件。可能,我不理解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 

1 个答案:

答案 0 :(得分:2)

这很可能是由于竞争条件造成的;您在迭代数据结构时实质上修改了数据结构。当然,数据结构是文件系统对目录中文件名称的概念。

正如评论中所指出的那样,在readdir()的Open Group的规范页面中,甚至会对此确切情况发出警告:

  

如果在最近一次调用opendir()rewinddir()后从目录中删除或添加了文件,则后续调用readdir()是否返回该文件的条目未指定

更好的方法是分两个阶段完成:

  1. 收集所有名字。
  2. 执行所需的重命名。
  3. 当然,您必须为重命名失败做好准备,因为其他进程可以与您并行重命名或删除文件。