~头都想痛了~:关于批量改名的问题!查了老贴,还是有疑问!(100)

  • 主题发起人 主题发起人 暴暴蓝
  • 开始时间 开始时间

暴暴蓝

Unregistered / Unconfirmed
GUEST, unregistred user!
批量修改文件名,由shelllistview选中项向LISTVIEW加入文件名, 如:1.txt 1.txt10.txt 2.txt 11.txt 改为 3.txt 请各位大侠帮帮忙,大家多提供下思路,算法,最好有 3.txt 4.txt 详细的代码和注释,急啊!实现功能和老版acesee 的重命名4.txt 5.xtx 功能十分相似,本人静候!想了很久,水平有限,请大虾们帮忙!
 
从A向B中添加文件时,B中的文件名称按顺序号命名,添加的同时,用一个数组来记录该顺序号对应于A中的源文件名,下面处理起来不就很方便了吗?
 
zixia:我以前的思路就是顺序号,1.txt 对应0,10.txt对应1.....依次类推。重命名用renamefile,当11.txt改为3.txt,后面的项,名为3.txt这不是重复了吗?不就失败了.您所说的一个数组记录顺序号,怎么实现的呢?请教!
 
type RFileNameMap=Record OldName:String; //源文件名称 NewName:String; //新文件名称 Deal:Integer; //0未处理,1已处理 End; ArrFileMap=Array of RFileNameMap; //数组var FilesMap:ArrFileMap;procedure RenameOne(Index:Integer);var I:Integer; S:String;begin if FilesMap[Index].Deal>0 then Exit; S:=FilesMap[Index].NewName; for I:= Low(FilesMap) to High(FilesMap) Do //如果存在老文件的名称和新文件的名称相同,则先命名那个文件 if AnsiCompareText( FilesMap.OldName, S)=0 then begin RenameOne(I); Break; end; RenameFile(FilesMap[Index].OldName, FilesMap[Index].NewName); //文件重命名 FilesMap[Index].Deal:=1;end;procedure RenameFiles;var I:Integer;begin for I:=Low(FilesMap) to High(FilesMap) Do RenameOne(I);end;
 
znxia:不好意思,大哥,怎么将我要改的listview1里的一组文件名加到您着代码里去啊,用tstringlist吗?您的代码思路能否表明,我学delphi没多久,还请您明示,多加注释!好像您用了递归,您能测试下吗?有源代码最好了,这个我做了好久了,硬是没搞定!还希望您耐心解释!:-P
 
先说说你是怎么把shelllistview选中加入到LISTVIEW中的吧,把代码提出来更好,我在那个基础上直接更改。其实添加的时候,主要是下面的代码:var H:Integer;begin Setlength(FilesMap,Length(FilesMap)+1); //数组增加一个元素 h:=High(FilesMap); //获得数组上标 //下面是赋值 FilesMap[H].OldName :=___ FilesMap[H].NewName :=___ FilesMap[h].Deal :=0;end;
 
大哥!真是没话说了~鼻涕眼泪啊!procedure button1onclick(sender:tobject);var li:TListItem; sf:TshellFolder;begin li:=shView.Selected; while li<>nil do begin sf:=shview.Folders[li.index]; with listview1.Items.Add do//将选中的一些文件名加入到listview控件中 begin if not sf.IsFolder then begin caption:=extractfilepath(sf.PathName); imageindex:=sf.ImageIndex(true); end; end; li:=shview.GetNextItem(li,sdall,[isselected]); end;
 
znxia:我写的代码在公司机器上,明天晚上我再来。希望能有更多大虾来帮忙!
 
你不可以把原文件改名后面加个.bak?迅雷下载就是这么搞的,遇有重名后面加扩展名。估计你是改同类型的文件,可以首先第一步全改名,后面加.bak,然后随便改都不会重复了。
 
为什么不反序进行呢?
 
我做了应用程序,form1上放了5个控件,分别是shelllistview1,listview1,button1,button2,spinedit1.已经实现了选中shelllistview1中的文件(多选,设置multiselect=true)按下button1,将所选文件名(不含路径)列入listview1中去,实现代码是procedure TForm1.Button1Click(Sender: TObject);//将所选项列入listview中var li:TListItem;begin li:=shelllistview1.Selected; while li<>nil do begin sf:=shelllistview1.Folders[li.index]; with listview1.Items.Add do begin if not sf.IsFolder then begin Caption:=sf.DisplayName; end; end; li:=shelllistview1.GetNextItem(li,sdall,[isselected]); end;end;然后想象实现老版acdsee的功能一样 ,选择spinedit1里的值,按下button2 实现能批量修改listview1中的文件名例子如提问中一样。可这批量修改文件名(不改扩展名)的思路老搞不定,水平有限,希望大家来帮忙啊!集思广益! 具体想实现: 例如listview下的文件列表: 015.txt 015.txt 02.txt 016.txt 04.txt 017.txt 05.txt spinedit1中的值为4,按下button2后 018.txt 09k.txt 019.txt 2.pdf 020.txt 4.txt 021.txt重命名文件要用到renamefile,就是具体思路很重要,有 实际代码就更好了,大虾们多多出力啊,在下感激了!
 
不好意思,写错了了 例如listview下的文件列表: 015.txt 015.txt 02.txt 016.txt 04.txt 017.txt 05.txt spinedit1中的值为4,按下Button2后 018.txt 09k.txt 019.txt 2. pdf 0.20.pdf 4.txt 021.txt大侠们,帮帮忙哦 ··我想了很久了,水平有限,怎么解决呢
 
楼主的意思我明白了 应该执行两次循环 第一次吧文件名称改成很复杂的 ×××××n.txt(n自然数)然后第二次循环就按楼主的意思处理!肯定不会重复  就是事件长了点!
 
把选中的文件名放到1个不定数组里面, 数组本身就有序列的, 按序列改就OK, 我以前写过, 只是一时找不到代码放再哪里了.
 
放到一个不定数组里?数组是有序列的 啊,按序列改?怎么个改法?怎么来的大虾这么少啊!5555
 
oldFileName NewFileName1.txt 1.txt10.txt 2.txt 11.txt 改为 3.txt 3.txt 4.txt 4.txt 5.txt 楼主是怕将11.txt改为3.txt后会出现文件名重复的错误,正确的解法是按照lps说的,从最后面的开始改名,先将4.txt改为5.txt,再将3.txt改为4.txt,11.txt改为3.txt,10.txt改为2.txt,1.txt改为1.txt
 
wandonghai:照你说的,只是其中一种情况,大哥看下老版acdsee的批量改名功能就知道了!LPS的说法不可行呢!
 
你这个不是编程问题,是思路混乱导致的。不就是文件名重名么?那你改文件名前判断一下文件是否已经存在,如果存在了那么都跳过,直到不存在为止不就得了么?给你个伪代码:N:= 0;for(对文件个数进行循环)begin while 文件[N]已经存在 do begin INC(N);//如果已存在则跳过,直到不存在为止。 Application.ProcessMessages; end; RenameFile(...IntToStr(N) + '.txt');end;
 
北京男人: 你是所说的有 道理 我确实有点思路混乱,想过 很多 办法,不过 您的 思路确实 不错,不过还修改每个文件的扩展名了,您看 了老版本ACESEE力量修改文件名的功能吗!
 
搞错没 哦 ?怎么没人回答!哭!:-<
 

Similar threads

S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
900
SUNSTONE的Delphi笔记
S
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
后退
顶部