Solved

How do i rename mutiply files with rename or renamefile?

Posted on 1998-12-02
9
168 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 100 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
Gigs: Get Your Project Delivered by an Expert

Select from freelancers specializing in everything from database administration to programming, who have proven themselves as experts in their field. Hire the best, collaborate easily, pay securely and get projects done right.

 
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

Live: Real-Time Solutions, Start Here

Receive instant 1:1 support from technology experts, using our real-time conversation and whiteboard interface. Your first 5 minutes are always free.

Question has a verified solution.

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

Suggested Solutions

Title # Comments Views Activity
Performance of SQL statement 37 111
Delphi: making a BW image transparent 10 37
enhance the following code 3 30
Delphi problems to abort a printjob 9 18
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…
Objective: - This article will help user in how to convert their numeric value become words. How to use 1. You can copy this code in your Unit as function 2. than you can perform your function by type this code The Code   (CODE) The Im…
Although Jacob Bernoulli (1654-1705) has been credited as the creator of "Binomial Distribution Table", Gottfried Leibniz (1646-1716) did his dissertation on the subject in 1666; Leibniz you may recall is the co-inventor of "Calculus" and beat Isaac…
Nobody understands Phishing better than an anti-spam company. That’s why we are providing Phishing Awareness Training to our customers. According to a report by Verizon, only 3% of targeted users report malicious emails to management. With compan…

786 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