Go Premium for a chance to win a PS4. Enter to Win

x
?
Solved

How do i rename mutiply files with rename or renamefile?

Posted on 1998-12-02
9
Medium Priority
?
177 Views
Last Modified: 2011-09-20
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
Comment
Question by:TCSCode
  • 4
  • 3
  • 2
9 Comments
 
LVL 8

Accepted Solution

by:
ZifNab earned 400 total points
ID: 1348966
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
 

Author Comment

by:TCSCode
ID: 1348967
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
 

Author Comment

by:TCSCode
ID: 1348968
Adjusted points to 100
0
Industry Leaders: 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!

 
LVL 8

Expert Comment

by:ZifNab
ID: 1348969
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
 
LVL 4

Expert Comment

by:erajoj
ID: 1348970
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
 
LVL 4

Expert Comment

by:erajoj
ID: 1348971
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
 
LVL 4

Expert Comment

by:erajoj
ID: 1348972
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
 

Author Comment

by:TCSCode
ID: 1348973
Thank's Alot ZifNab And erajoj.

 
0
 

Author Comment

by:TCSCode
ID: 1348974
Thank's Alot ZifNab And erajoj.

 
0

Featured Post

Important Lessons on Recovering from Petya

In their most recent webinar, Skyport Systems explores ways to isolate and protect critical databases to keep the core of your company safe from harm.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

This article explains how to create forms/units independent of other forms/units object names in a delphi project. Have you ever created a form for user input in a Delphi project and then had the need to have that same form in a other Delphi proj…
In my programming career I have only very rarely run into situations where operator overloading would be of any use in my work.  Normally those situations involved math with either overly large numbers (hundreds of thousands of digits or accuracy re…
Video by: ITPro.TV
In this episode Don builds upon the troubleshooting techniques by demonstrating how to properly monitor a vSphere deployment to detect problems before they occur. He begins the show using tools found within the vSphere suite as ends the show demonst…
Are you ready to place your question in front of subject-matter experts for more timely responses? With the release of Priority Question, Premium Members, Team Accounts and Qualified Experts can now identify the emergent level of their issue, signal…

972 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question