• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 178
  • Last Modified:

How do i rename mutiply files with rename or renamefile?

How do i rename mutiply files with rename or renamefile, I want to rename about 200 jpg files by just renameing the first part of the file to 0001.jpg 0002.jpg by clicking on 1 button.
 
0
TCSCode
Asked:
TCSCode
  • 4
  • 3
  • 2
1 Solution
 
ZifNabCommented:
Hi TCSCode,

Haven't tested this, but this should it be. It gives you a start, now you can modify the code to what you like. e.g. let user choose the files, not only directory.

procedure TForm1.BitBtn1Click(Sender: TObject);
var
 SearchRec: TSearchRec;
 ErrorCode : integer;
 Number : Integer
 NewName : String;
begin
  Number := 0;
  showmessage('starting');
  ErrorCode := FindFirst('c:\pathtojpg\*.jpg', faAnyFile, SearchRec);
  NewName := IntToStr(Number)+'jpg';
  If ErrorCode <> 0 then RenameFile(SearchRec.Name, NewName)  
   else showmessage('no jpg-files or error');
  Label1.Caption := SearchRec.Name + ' is ' + IntToStr(SearchRec.Size) + ' bytes in size';
  While (FindNext(SearchRec) <> 0) do
   begin
    Inc(Number);
    NewName := IntToStr(Number)+'jpg';
    If ErrorCode <> 0 then RenameFile(SearchRec.Name, NewName);
   end;
  FindClose(SearchRec);
  showmessage('ended');
end;



0
 
TCSCodeAuthor Commented:
Hmmm I test the code above and it compiles fine but does'nt rename and files? is there somthing that i am missing? Thank's TCSCode.
0
 
TCSCodeAuthor Commented:
Adjusted points to 100
0
Independent Software Vendors: We Want Your Opinion

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

 
ZifNabCommented:
Hi TCDCode

Boy, I see, did I make mistakes.... ok here comes a tested one :

procedure TForm1.Button1Click(Sender: TObject);
var
 SearchRec: TSearchRec;
 ErrorCode : integer;
 Number : Integer;
 NewName : String;
 PATH  : string;

begin
  Number := 0;
  PATH := 'c:\test\';
  showmessage('starting');
  ErrorCode := FindFirst(PATH + '*.jpg', faAnyFile, SearchRec);
  NewName := IntToStr(Number)+'.jpg';
  If ErrorCode = 0 then RenameFile(PATH+SearchRec.Name, PATH+NewName)
   else showmessage('no jpg-files or error');

  While (FindNext(SearchRec) = 0) do
   begin
    Inc(Number);
    NewName := IntToStr(Number)+'.jpg';
    RenameFile(PATH+SearchRec.Name, PATH+NewName);
   end;
  FindClose(SearchRec);
  showmessage('ended');
end;

Regards, Zif.
0
 
erajojCommented:
The code is missing two dots ("."):

    NewName := IntToStr(Number)+'jpg';

should be:

    NewName := IntToStr(Number)+'.jpg';

The code isn't very foolproof since if there's already a file with a name like 5.jpg, the fifth file won't be renamed. Then sorting the files won't be very beautiful, so...:

unit Main;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;

type
  TMainForm = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    Filenames, NumericFilenames: TStringList;
    { Private declarations }
  public
    { Public declarations }
  end;

var
  MainForm: TMainForm;

  sDirectory: string = 'x:\web_download\images\test';


implementation

{$R *.DFM}

function IntToPaddedStr(iValue, iDigits: Integer): string;
var
  iIndex: Integer;
  sTemp : string;
begin
  Result := '';
  sTemp := IntToStr(iValue);
  for iIndex := 1 to iDigits - Length(sTemp) do
    AppendStr(Result, '0');
  AppendStr(Result, sTemp);
end;

procedure PopulateFileList(sPath, sMask: string; list: TStringList);
var
  sr: TSearchRec;
begin
  if not Assigned(list) then
    Exit;
  list.BeginUpdate;
  list.Clear;
  if sPath[Length(sPath)]<>'\' then
    AppendStr(sPath, '\');
  if FindFirst(sPath+sMask, faAnyFile, sr) = 0 then
  repeat
    with sr do
      if Attr and (faDirectory or faVolumeID) = 0 then
        list.Add(sPath+Name);
  until FindNext(sr)<>0;
  FindClose(sr);
  list.EndUpdate;
end;

procedure HandleNumericFilenames(list, numlist: TStringList);
var
  iIndex, iValue, iCount, iDigits, iErrorPos: Integer;
  sPath, sName, sExt: string;
begin
  if not Assigned(list) then
    Exit;
  if not Assigned(numlist) then
    Exit;
  list.BeginUpdate;
  numlist.BeginUpdate;
  numlist.Clear;
  iCount  := list.Count;
  iDigits := Trunc(Ln(iCount)/Ln(10))+2;
  for iIndex := iCount - 1 downto 0 do
  begin
    sName := ExtractFileName(list[iIndex]);
    sExt  := ExtractFileExt(sName);
    SetLength(sName, Length(sName)-Length(sExt));
    Val(sName, iValue, iErrorPos);
    if (iErrorPos = 0) and (iValue <= iCount) then
      if (IntToPaddedStr(iValue, iDigits) = sName) then
      begin
        numlist.Add(list[iIndex]);
        list.Delete(iIndex);
      end;
  end;
  numlist.EndUpdate;
  list.EndUpdate;
end;

procedure RenameFiles(list, numlist: TStringList);
var
  iIndex, iValue, iCount, iDigits, iPos: Integer;
  sFilename, sPath, sName, sExt: string;
begin
  if not Assigned(list) then
    Exit;
  if not Assigned(numlist) then
    Exit;
  numlist.Sorted := True; { this is absolutely necessary for numlist.Find! }
  iValue  := 1;
  iCount  := list.Count;
  if (iCount=0) then
    Exit;
  iDigits := Trunc(Ln(iCount)/Ln(10))+2;
  for iIndex := 0 to iCount - 1 do
  begin
    sPath := ExtractFilePath(list[iIndex]);
    sExt  := ExtractFileExt(list[iIndex]);
    repeat
      sFilename := sPath + IntToPaddedStr(iValue, iDigits) + sExt;
      Inc(iValue);
    until not numlist.Find(sFilename,iPos);
    RenameFile(list[iIndex], sFilename); { no error handling, this is up to you... }
  end;
end;

procedure TMainForm.Button1Click(Sender: TObject);
begin
  try
    Filenames := TStringList.Create;
    NumericFilenames := TStringList.Create;

    PopulateFileList(sDirectory, '*.jpg', Filenames);
    HandleNumericFilenames(Filenames, NumericFilenames);
    RenameFiles(Filenames, NumericFilenames);

  finally
    NumericFilenames.Free;
    Filenames.Free;
  end;
end;

end.

This code is from a tool I made a while back. It's a little bit complicated, but works better, is much faster the other time around and doesn't re-index already indexed files.

/// John
0
 
erajojCommented:
There's a bad bug in the procedure HandleNumericFilenames:

  iCount  := list.Count;
  iDigits := Trunc(Ln(iCount)/Ln(10))+2;

  ...should be:

  iCount  := list.Count;
  if (iCount>0) then
    iDigits := Trunc(Ln(iCount)/Ln(10))+2;

Otherwise the app will dive if there are no JPEGs in the folder.
Sorry!

/// John
0
 
erajojCommented:
Man! The code I sent you was just a piece of crap!
Here's a decrappitated version (still not perfect, but hey, nobody is):

unit Main;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;

type
  TMainForm = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    Filenames, NumericFilenames: TStringList;
    { Private declarations }
  public
    { Public declarations }
  end;

var
  MainForm: TMainForm;

  iDigits: Integer; { changed here! }
  sDirectory: string = 'x:\web_download\images\test';


implementation

{$R *.DFM}

function IntToPaddedStr(iValue, iDigits: Integer): string;
var
  iIndex: Integer;
  sTemp : string;
begin
  Result := '';
  sTemp := IntToStr(iValue);
  for iIndex := 1 to iDigits - Length(sTemp) do
    AppendStr(Result, '0');
  AppendStr(Result, sTemp);
end;

procedure PopulateFileList(sPath, sMask: string; list: TStringList);
var
  sr: TSearchRec;
begin
  if not Assigned(list) then
    Exit;
  list.BeginUpdate;
  list.Clear;
  if sPath[Length(sPath)]<>'\' then
    AppendStr(sPath, '\');
  if FindFirst(sPath+sMask, faAnyFile, sr) = 0 then
  repeat
    with sr do
      if Attr and (faDirectory or faVolumeID) = 0 then
        list.Add(sPath+Name);
  until FindNext(sr)<>0;
  FindClose(sr);
  list.EndUpdate;
end;

procedure HandleNumericFilenames(list, numlist: TStringList);
var
  iIndex, iValue, iCount, iErrorPos: Integer;
  sPath, sName, sExt: string;
begin
  if not Assigned(list) then
    Exit;
  if not Assigned(numlist) then
    Exit;
  list.BeginUpdate;
  numlist.BeginUpdate;
  numlist.Clear;
  iCount  := list.Count;
  { changed here! }
  for iIndex := iCount - 1 downto 0 do
  begin
    sName := ExtractFileName(list[iIndex]);
    sExt  := ExtractFileExt(sName);
    SetLength(sName, Length(sName)-Length(sExt));
    Val(sName, iValue, iErrorPos);
    if (iErrorPos = 0) and (iValue <= iCount) then
      if (IntToPaddedStr(iValue, iDigits) = sName) then
      begin
        numlist.Add(list[iIndex]);
        list.Delete(iIndex);
      end;
  end;
  numlist.EndUpdate;
  list.EndUpdate;
end;

procedure RenameFiles(list, numlist: TStringList);
var
  iIndex, iValue, iCount, iPos: Integer;
  sFilename, sPath, sName, sExt: string;
begin
  if not Assigned(list) then
    Exit;
  if not Assigned(numlist) then
    Exit;
  numlist.Sorted := True; { this is absolutely necessary for numlist.Find! }
  iValue  := 1;
  iCount  := list.Count;
  { changed here! }
  for iIndex := 0 to iCount - 1 do
  begin
    sPath := ExtractFilePath(list[iIndex]);
    sExt  := ExtractFileExt(list[iIndex]);
    repeat
      sFilename := sPath + IntToPaddedStr(iValue, iDigits) + sExt;
      Inc(iValue);
    until not numlist.Find(sFilename,iPos);
    RenameFile(list[iIndex], sFilename); { no error handling, this is up to you... }
  end;
end;

procedure TMainForm.Button1Click(Sender: TObject);
begin
  try
    Filenames := TStringList.Create;
    NumericFilenames := TStringList.Create;

    PopulateFileList(sDirectory, '*.jpg', Filenames);
    if (Filenames.Count>0) then { changed here! }
    begin
      iDigits := Trunc(Ln(Filenames.Count)/Ln(10))+2;
      HandleNumericFilenames(Filenames, NumericFilenames);
      RenameFiles(Filenames, NumericFilenames);
    end;

  finally
    NumericFilenames.Free;
    Filenames.Free;
  end;
end;

end.

I guess it's time for me to go home...

/// John
0
 
TCSCodeAuthor Commented:
Thank's Alot ZifNab And erajoj.

 
0
 
TCSCodeAuthor Commented:
Thank's Alot ZifNab And erajoj.

 
0

Featured Post

What does it mean to be "Always On"?

Is your cloud always on? With an Always On cloud you won't have to worry about downtime for maintenance or software application code updates, ensuring that your bottom line isn't affected.

  • 4
  • 3
  • 2
Tackle projects and never again get stuck behind a technical roadblock.
Join Now