[ bobby100 @ 20.05.2004. 10:33 ] @
Pozdrav svima,

Mucim se vec izvesno vreme da napravim malo specifican Multi-rename tool, naime potrebna mi je rutina koja bi zalazila u sve subfoldere zadatog foldera (to je inace deo koji ne umem da uradim) i da mi preimenuje sve foldere u velika slova (uppercase) , a po zelji i imena fajlova (znaci opcija i za imena fajlova da budu uppercase).

Ako neko ima bilo kakav konstruktivan predlog za pravljenje rutine koja bi prosetala kroz sve subfoldere, molim vas pomagajte.

Unapred zahvalan
Spasic Boban
[ neor @ 20.05.2004. 13:38 ] @
Pogledaj u helpu primer za funkcije FindFirst i FindNext. Sa njima "setas" po direktorijumu. Kad naidjes na fajl koji ima atribut faDirectory onda rekurzivno udjes u taj folder (ne zaboravi da ignorises "." i ".." jer ces imati beskonacnu rekurziju)
[ bobby100 @ 22.05.2004. 00:36 ] @
Hvala svima, uspeo sam da odradim posao. Evo funkcija i procedura koje sam koristio:
Code:

procedure RenameDir(DirFrom, DirTo: string); 
var 
  shellinfo: TSHFileOpStruct; 
begin 
  with shellinfo do 
  begin 
    Wnd    := 0; 
    wFunc  := FO_RENAME; 
    pFrom  := PChar(DirFrom); 
    pTo    := PChar(DirTo);
    {fFlags := FOF_FILESONLY or FOF_ALLOWUNDO or
              FOF_SILENT or FOF_NOCONFIRMATION;}
    fFlags := FOF_ALLOWUNDO or
              FOF_SILENT or FOF_NOCONFIRMATION;
  end;
  SHFileOperation(shellinfo);
end;


function FindFiles(Directory: string; InclAttr, ExclAttr: Integer;
const SubDirs: Boolean; const Files: TStrings): Integer;
var
  SearchRec: TSearchRec;
begin
  Directory := IncludeTrailingPathDelimiter(Directory);
  FillChar(SearchRec, SizeOf(SearchRec), 0);
  if FindFirst(Directory + '*.*', faAnyFile, SearchRec) = 0 then
  begin
    try
      repeat
        if (SearchRec.Name <> '.') and (SearchRec.Name <> '..') then
          if ((SearchRec.Attr and InclAttr > 0) or ((SearchRec.Attr = 0) and (InclAttr <> faDirectory))) and
               (SearchRec.Attr and ExclAttr = 0) then
          begin
            Files.Add(Directory + SearchRec.Name);
            if SubDirs then
              if SearchRec.Attr and faDirectory <> 0 then
                FindFiles(Directory + SearchRec.Name, InclAttr, ExclAttr, SubDirs, Files);
          end;
      until
        FindNext(SearchRec) <> 0;
    finally
      FindClose(SearchRec);
    end;
  end;
  Result := Files.Count;
end;

procedure Trenamer_form.Button1Click(Sender: TObject); // Find procedura
var
  sl: TStringList;
  include: integer;
  exclude: integer;
  subfolders: boolean;
  rootfolder: string;

begin
include := 0;
exclude := 0;
subfolders := false;
rootfolder := ShellTreeView1.path;
 if  checkbox1.Checked = true then
  begin
    Listbox1.Items.Add(rootfolder);
    include := faDirectory;
  end;
 if  checkbox2.Checked = true then include := include or faAnyFile;
 if  checkbox3.Checked = true then subfolders := true;
 if  checkbox3.Checked = false then exclude := faDirectory;
 sl := TStringList.Create;
  begin
    try
      FindFiles(rootfolder, include, exclude, subfolders, sl);
      Listbox1.Items.AddStrings(sl);
    finally
      sl.Free;
    end;
   end;
end;


procedure Trenamer_form.Button4Click(Sender: TObject); //name to uppercase
var
counter: integer;
begin
  counter := 0;
  while counter < (Listbox2.Items.Count) do
  begin
      RenameFile(Listbox1.Items.Strings[counter],(AnsiUpperCaseFileName(Listbox2.Items.Strings[counter])));
      RenameDir(Listbox1.Items.Strings[counter],(AnsiUpperCaseFileName(Listbox2.Items.Strings[counter])));
  counter := counter +1;
  end;
end;

Ovo zadnje je isto i za Lowercase, osim sto se koristi AnsiLowerCase();

Pozdrav svima, nadam se da ce ovo nekom koristiti