Solved

How do i rename mutiply files with rename or renamefile?

Posted on 1998-12-02
9
174 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
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 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
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!

 
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

[Webinar] How Hackers Steal Your Credentials

Do You Know How Hackers Steal Your Credentials? Join us and Skyport Systems to learn how hackers steal your credentials and why Active Directory must be secure to stop them. Thursday, July 13, 2017 10:00 A.M. PDT

Question has a verified solution.

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

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…
In this tutorial I will show you how to use the Windows Speech API in Delphi. I will only cover basic functions such as text to speech and controlling the speed of the speech. SAPI Installation First you need to install the SAPI type library, th…
Michael from AdRem Software explains how to view the most utilized and worst performing nodes in your network, by accessing the Top Charts view in NetCrunch network monitor (https://www.adremsoft.com/). Top Charts is a view in which you can set seve…
In this brief tutorial Pawel from AdRem Software explains how you can quickly find out which services are running on your network, or what are the IP addresses of servers responsible for each service. Software used is freeware NetCrunch Tools (https…

728 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