我想做一个特定文件的更名器(源于.rmvb的电影改为.rm就可以用金山影霸播放)。用CFileFind做,加上递归。但是会循环两次的,各位看看:
Recurse(LPCTSTR pstr, int flag)
{
   CFileFind finder;
   CString strWildcard(pstr);
   strWildcard += _T("\\*.*");
   BOOL bWorking = finder.FindFile(strWildcard);
   while (bWorking)
   {   
      bWorking = finder.FindNextFile();
      if (finder.IsDots())
{  continue;    }
      if (finder.IsDirectory())
     {
       CString str = finder.GetFilePath();
        Recurse(str,flag);
      }
  else
  {
  CString str=finder.GetFilePath();
  CString stt=str+".bak";
  CFile::Rename(str,stt);
  }
   }
   finder.Close();
}不用Rename()函数就只是遍历一次,现在这段函数的的结果就是变成*.rmvb.bak.bak了,不知道为什么。

解决方案 »

  1.   

    CString str=finder.GetFilePath();
    CString stt=str+".bak";
    CFile::Rename(str,stt);
    把上述代码改为
      CString str=finder.GetFilePath();
      CString stt=str;
      stt.Replace ("rmvb","bak");//这边是要改的后缀名的变更
      CFile::Rename(str,stt);
      

  2.   

    没有啊, 偶看了一下都没有问题, 再试试调用了你的函数, 如Recurse("C:\\bbb\\", 0);
    没有任何问题啊. 该目录下的所有文件屁股上都多了个.BAK, 如果要去掉后缀改用你要选用的后缀, 递归还要修改一下,然后去掉最后屁股后面的后缀,把你的加入就可以了.
      

  3.   

    我知道两位的意思,我给文件添加.bak是一个试验的。
    按照我的预想,所有文件的后缀都将由*.*变为*.*.bak的
    但是现在我运行得到的效果变成了*.*.bak.bak了。
    我的程序是一个窗口模式的,先是从一个目录选择窗口得到要改名的目录,选定改名规则(就是flag的用处,现在没有用到),按确定就调用Recurse(LPCTSTR pstr, int flag)。
    结果就会出现上述问题。
      

  4.   

    反正我没有遇到,一切正常,程序也是对的, 不会变成.bak.bak. 除非测试了一次又一次才会.
      

  5.   

    我没有测试,但这是有可能的,也许FindNextFile就是把下一个文件名和已经处理过的比照呢?
    你可以跳过文件扩展名是.bak的文件。