注册 登录
编程论坛 VC++/MFC

关于批量更改文件后缀名,如“.bmp”改为“.jpg”的问题,纠结我心。。。。。。

lanriver 发布于 2011-08-28 23:55, 3185 次点击
   cstring srt2
   str2="c:\\bmp\\my_bmp\\*.*";
   CFileFind finder;
   BOOL bWorking = finder.FindFile(str2);
   while (bWorking)
   {
      bWorking = finder.FindNextFile();
     CString oldName,newName;
    oldName=finder.GetFileName();
    newName=finder.GetFileTitle()+".jpg";
    CFile::Rename(oldName,newName);  //更换文件的扩展名
    break;
   }   
    finder.Close();
//前面的代码主要是批量读写文件(没有问题,后缀名没改过来),所以用上面的代码改后缀名,编译时没有报错,运行程序时提示“:“在存取一未命名文件时发生共享违例” ,那为大侠帮帮忙,或者给个代码,vc++新手,不懂,骂我也行,但请赐教,谢谢!



[ 本帖最后由 lanriver 于 2011-8-29 00:05 编辑 ]
8 回复
#2
hahayezhe2011-08-29 11:45
文件已经被其他进程打开???或者存在同名
#3
lanriver2011-08-29 21:18
以下是引用hahayezhe在2011-8-29 11:45:33的发言:

文件已经被其他进程打开???或者存在同名
谢谢,大哥的回复,用二进制读写的方式做的bmp批量转换jpg的程序,但转换后的文件扩展名还是.bmp,用hedit十六进制编辑器查看文件已经转换成功,手动改后缀名为“.JPG”后,用photoshop打开jpg格式图片时后可以显示图片,大体为:从c:\pp\my_bmp\*.bmp批量二进制方式读,然后同样方式写入到c:\pp\my_jpg\*.jpg,写入后文件格式转换成功,但后缀名没改过来,所以紧跟下来的代码就是贴出来的,批量改后缀名。问题就出在这里

大部分都完成了,被卡在这里,难道真的没人能帮到吗?等高手解决。

[ 本帖最后由 lanriver 于 2011-8-29 21:36 编辑 ]
#4
lanriver2011-08-29 21:25
自己家顶起来!

[ 本帖最后由 lanriver 于 2011-8-29 21:39 编辑 ]
#5
hahayezhe2011-08-29 22:40
修改名字时 你确定所有的文件句柄都close掉了?? 你确定不是在改的过程中 存在其他的代码段或者进行在操作这个文件??
#6
yuccn2011-08-29 22:43
大哥,你发的代码有问题吧
cstring srt2
   str2="c:\\bmp\\my_bmp\\*.*";
这个是不是应该改成:
CString str2;   
str2="c:\\bmp\\my_bmp\\*.*";

存在三个错误,1 cstring 应该是CString,2 srt2应该改成str2 声明和使用都不一样,3,str2之后没有分号。

还有一个逻辑错误,
while (bWorking){
 bWorking = finder.FindNextFile();
        CString oldName,newName;
        oldName=finder.GetFileName();
        newName=finder.GetFileTitle()+L".jpg";
        CFile::Rename(oldName,newName);  //更换文件的扩展名
       break;
}
里面有个break;是不是应该去掉?否则就达不到批量处理了,而是改了一个就退出了。
#7
yuccn2011-08-29 23:11
CFile::Rename(oldName,newName); 这个输入应该是一个完整路径的,而不是一个文件名

CString str2;
    str2="c:\\bmp\\my_bmp\\*.*";
    CFileFind finder;
    BOOL bWorking = finder.FindFile(str2);
    while (bWorking)
    {
        CString oldName,newName;
        oldName = finder.GetFileName();
        if (oldName == "." || oldName == "..") { // 这个地方要对目录名为“.”的过滤
            bWorking = finder.FindNextFile();
            continue;            
        }
        oldName="c:\\bmp\\my_bmp\\" + finder.GetFileName();
        newName="c:\\bmp\\my_bmp\\"+finder.GetFileTitle()+L".jpg";
        CFile::Rename(oldName,newName);  //更换文件的扩展名
        bWorking = finder.FindNextFile();
    }   
    finder.Close();

这样就能够改名了。
不过这样还是有问题的。因为你一边遍历文件一边改名。这样就是逻辑上的一个错误了。建议这样

先把遍历到的文件名保存到一个链表中,遍历完成后再去遍历链表,这个时候才去改名。 否则一边遍历文件一边改名,这样会在你改名了之后会影响遍历下一个文件。可能引起运行时候的错误

[ 本帖最后由 yuccn 于 2011-8-29 23:13 编辑 ]
#8
lanriver2011-08-30 20:16
谢谢hahayezhe,非常感谢yuccn的指教,和给出的详细代码,并纠正我的错误,稍晚我上机实验,会给分给大佬!
#9
lanriver2011-09-12 00:08
谢谢各位,我已经解决了,在写的过程中直接改后缀名。
1