首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

写个批量更改文件名的小工具遇到的有关问题

2012-03-09 
写个批量更改文件名的小工具遇到的问题代码如下,可以批量更改文件名,但当文件名超过129个时,多余出来的改

写个批量更改文件名的小工具遇到的问题
代码如下,可以批量更改文件名,但当文件名超过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;

热点排行