| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3185 人关注过本帖
标题:关于批量更改文件后缀名,如“.bmp”改为“.jpg”的问题,纠结我心。。。。 ...
只看楼主 加入收藏
lanriver
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:133
专家分:101
注 册:2008-8-9
结帖率:70.59%
收藏
已结贴  问题点数:0 回复次数:8 
关于批量更改文件后缀名,如“.bmp”改为“.jpg”的问题,纠结我心。。。。。。
   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 编辑 ]
搜索更多相关主题的帖子: 扩展名 运行程序 while 
2011-08-28 23:55
hahayezhe
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:湖南张家界
等 级:贵宾
威 望:24
帖 子:1386
专家分:6999
注 册:2010-3-8
收藏
得分:0 
文件已经被其他进程打开???或者存在同名
2011-08-29 11:45
lanriver
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:133
专家分:101
注 册:2008-8-9
收藏
得分:0 
以下是引用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 编辑 ]
2011-08-29 21:18
lanriver
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:133
专家分:101
注 册:2008-8-9
收藏
得分:0 
自己家顶起来!

[ 本帖最后由 lanriver 于 2011-8-29 21:39 编辑 ]
2011-08-29 21:25
hahayezhe
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:湖南张家界
等 级:贵宾
威 望:24
帖 子:1386
专家分:6999
注 册:2010-3-8
收藏
得分:5 
修改名字时 你确定所有的文件句柄都close掉了?? 你确定不是在改的过程中 存在其他的代码段或者进行在操作这个文件??
2011-08-29 22:40
yuccn
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:何方
等 级:版主
威 望:167
帖 子:6815
专家分:42393
注 册:2010-12-16
收藏
得分:5 
大哥,你发的代码有问题吧
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;是不是应该去掉?否则就达不到批量处理了,而是改了一个就退出了。

我行我乐
公众号:逻辑客栈
我的博客:
https://blog.yuccn. net
2011-08-29 22:43
yuccn
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:何方
等 级:版主
威 望:167
帖 子:6815
专家分:42393
注 册:2010-12-16
收藏
得分:10 
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 编辑 ]

我行我乐
公众号:逻辑客栈
我的博客:
https://blog.yuccn. net
2011-08-29 23:11
lanriver
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:133
专家分:101
注 册:2008-8-9
收藏
得分:0 
谢谢hahayezhe,非常感谢yuccn的指教,和给出的详细代码,并纠正我的错误,稍晚我上机实验,会给分给大佬!
2011-08-30 20:16
lanriver
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:133
专家分:101
注 册:2008-8-9
收藏
得分:0 
谢谢各位,我已经解决了,在写的过程中直接改后缀名。
2011-09-12 00:08
快速回复:关于批量更改文件后缀名,如“.bmp”改为“.jpg”的问题,纠结我心。。 ...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.067406 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved