写个批量更改文件名的小工具遇到的问题
代码如下,可以批量更改文件名,但当文件名超过129个时,多余出来的改不了;
不知道什么原因,望指教!谢谢
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, XPMan,ShellApi;
type
TForm1 = class(TForm)
ListBox1: TListBox;
Button1: TButton;
Button2: TButton;
Button3: TButton;
XPManifest1: TXPManifest;
Edit1: TEdit;
OpenDialog1: TOpenDialog;
procedure Button1Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure FormActivate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
ListBox1.Clear ;
Opendialog1.execute;
ListBox1.Items.AddStrings(OpenDialog1.Files);
end;
procedure TForm1.Button3Click(Sender: TObject);
var
OldName,NewName,Name:string;
i:integer;
begin
Name:=Edit1.Text;
if (Name= ' ') or (Name= '文件前缀 ') then
Application.MessageBox( '请输入文件前缀,如 "Mp3,Musie " ', '提示: ',MB_OK+MB_ICONASTERISK)
else begin
for i:=0 to ListBox1.Items.Count-1 do
begin
OldName:=ListBox1.Items.Strings[i];
if i <9 then
begin
NewName:=ExtractFileDir(OldName)+ '\ '+Name+ ' 00 '+IntToStr(i+1)+ExtractFileExt(OldName);
RenameFile(OldName,NewName);
end
else if (i> =9) and (i <99) then
begin
NewName:=ExtractFileDir(OldName)+ '\ '+Name+ ' 0 '+IntToStr(i+1)+ExtractFileExt(OldName);
RenameFile(OldName,NewName);
end
else if (i> =99) then
begin
NewName:=ExtractFileDir(OldName)+ '\ '+Name+IntToStr(i+1)+ExtractFileExt(OldName);
RenameFile(OldName,NewName);
end;
end;
Application.MessageBox( '批量修改完毕 ', '提示: ',MB_OK+MB_ICONASTERISK);
ShellExecute(Handle, 'explore ', PChar(ExtractFileDir(OldName)), nil, nil, SW_SHOW);
end;
end;
procedure TForm1.FormActivate(Sender: TObject);
begin
Edit1.SetFocus;
end;
end.
[解决办法]
procedure TForm1.Button3Click(Sender: TObject);
var
OldName,NewName,Name:string;
i:integer;
begin
Name:=Edit1.Text;
if (Name= ' ') or (Name= '文件前缀 ') then
Application.MessageBox( '请输入文件前缀,如 "Mp3,Musie " ', '提示: ',MB_OK+MB_ICONASTERISK)
else begin
for i:=0 to ListBox1.Items.Count-1 do
begin
OldName:=ListBox1.Items.Strings[i];
NewName:= Format( '%s\%s%.3d%s ',
[ExtractFileDir(OldName),Name,i,ExtractFileExt(OldName)]);
RenameFile(OldName,NewName);
end;
Application.MessageBox( '批量修改完毕 ', '提示: ',MB_OK+MB_ICONASTERISK);
ShellExecute(Handle, 'explore ', PChar(ExtractFileDir(OldName)), nil, nil, SW_SHOW);
end;
end;
[解决办法]
改文件名的 uses shlobj,comobj
class function TfrmMain.ChangeFileName(const FileName,
szName: string): Boolean;
var
P: PWideChar;
NewPIDL, RenPIDL, PathPIDL: PItemIDList;
Flags,
NumChars: LongWord;
//Index: Integer;
FIDesktopFolder: IShellFolder;
NewShellFolder: IShellFolder;
Value, PathValue: string;
begin
SHGetDesktopFolder(FIDesktopFolder);
Value := ExtractFileName(FileName);
PathValue := ExtractFilePath(FileName);
NumChars := Length(PathValue);
Flags := 0;
P := StringToOleStr(PathValue);
OLECheck(
FIDesktopFolder.ParseDisplayName(
Application.Handle,
nil,
P,
NumChars,
PathPIDL,
Flags)
);
OLECheck(
FIDesktopFolder.BindToObject(
PathPIDL,
nil,
IID_IShellFolder,
Pointer(NewShellFolder))
);
NumChars := Length(Value);
Flags := 0;
P := StringToOleStr(Value);
OLECheck(
NewShellFolder.ParseDisplayName(
Application.Handle,
nil,
P,
NumChars,
NewPIDL,
Flags)
);
Result := NewShellFolder.SetNameOf(
Application.Handle,
NewPIDL,
StringToOleStr(szName),
128,
RenPIDL
) = noerror;
//SHChangeNotify(SHCNE_RENAMEITEM,SHCNF_FLUSH,NewPIDL,nil);
end;