Entwickler-Ecke

Dateizugriff - Viele Ordner umbennenen


naleh - Mo 03.11.03 20:34
Titel: Viele Ordner umbennenen
Hallo,

ich hab in einem Programm ein TShellListview und möchte alle Ordner (viele) darin umbennenen (mit Zahlen). Ich hab jetzt folgende Procedure da stehen, und die funzt auch teilweise, aber manche Ordner lässt er einfach aus. Mit der Fehlermeldung (wenn ich FOF_SILENT rausmach):
Zitat:
Datei kann nicht umbennant werden: Wählen sie nur eine Datei, oder verwenden sie den MS-DOS-Platzhalter (z.B. *.txt), um eine Gruppe von Dateien mit ähnlichen Namen umzubennen.



Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
procedure TForm2.Button2Click(Sender: TObject);
var i,nummer:integer;
begin
  nummer:=StrToInt(edit1.Text);
  For i := 0 to ShellListview1.Items.Count-1 do
  begin
    sleep(10);
    RenameDir(
        shelllistview1.Folders[i].PathName, 
        ExtractFileDir (shelllistview1.Folders[i].PathName)
          +'\'+IntToStr(nummer)
      );
    inc(nummer);
  end;
end;

procedure TForm2.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;
  end; 
  SHFileOperation(shellinfo); 
end;


Ich hab schon "Suche" benutzt und gegooglt, und bin auf diese CreateDir und ForceDir Geschichte gekommen bei vielen Dateien, aber ich steig da nicht ganz durch.

Danke fürs lesen ;) hoffentlich kommt bald ne kompetente Antwort

Moderiert von user profile iconTino: Titel geändert; Delphi-Tags hinzugefügt


Tino - Di 04.11.03 09:59

Hallo!

Ich kenne die TShellListView Komponente nicht. Aber versuch mal folgendes:

Ersetz die folgende Zeile:

Delphi-Quelltext
1:
For i := 0 to ShellListview1.Items.Count-1 do                    

durch

Delphi-Quelltext
1:
For i := ShellListview1.Items.Count-1 downto 0 Do                    


Gruß
Tino


naleh - Di 04.11.03 23:25

Also das ganze andersrum laufen zu lassen hat wenig sinn, wegen der nummerierung(ausserdem löst sich dadurch nicht das problem). aber ich hab eben mal ReNameFile Probiert. Damit klappt das wunderbar. Naja das kann ja auch keiner ahnen das man mit renamefile auch verzeichnisse umbenennen kann. ;)


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
procedure TForm2.Button2Click(Sender: TObject);
var i,nummer:integer;
    templist:TStrings;
begin
Shelllistview1.AutoRefresh:= false;
templist:=Tstringlist.Create;
nummer:=StrToInt(edit1.Text);
For i := 0 to ShellListview1.Items.Count-1 do
 begin
 templist.Add(shelllistview1.Folders[i].PathName);
 end;

for i:= 0 to templist.Count-1 do
 begin
 RenameFile(templist[i],ExtractFileDir(templist[i])+'\'+IntToStr(nummer));
 Statusbar1.Panels[0].Text := IntToStr(i+1)+' / '+IntToStr(templist.Count)+'Ordnern.';
 Application.ProcessMessages;
 inc(nummer);
 end;

templist.Free;
shelllistview1.AutoRefresh:= true;
shelllistview1.Refresh;
end;



Also Danke für die Hilfe

Moderiert von user profile iconTino: Delphi-Tags hinzugefügt.


Tino - Mi 05.11.03 11:45

naleh hat folgendes geschrieben:
Also das ganze andersrum laufen zu lassen hat wenig sinn, wegen der nummerierung(ausserdem löst sich dadurch nicht das problem).

Ich dachte hier geht es um das löschen von Dateien/Verzeichnissen. Denn dann hätte die Laufrichtung eine entscheidene Rolle gespielt.

Gruß
Tino


naleh - Mi 05.11.03 18:16

Weshalb? *interesier* ;)


Tino - Do 06.11.03 10:08

Guten Morgen!

Wenn du z. b. vier Ordner hast: Rot, Blau, Gelb und Grün. Der Ordner "Rot" hat den Index 0, der Ordner "Blau" den Index 1, "Gelb" hat den Index 2 und der Ordner "Grün" den Index 3. Wenn du jetzt anfängst von oben an die Ordner zu löschen dann beginnst du mit dem Ordner mit dem Index 0 zu löschen (also Rot). Danach hast du nur noch die Ordner Blau, Gelb und Grün. Jetzt willst du ja den Ordner "Blau" löschen. Du benutzt aber dafür dann den Index 1. Dieser Index verweist aber auf den Ordner "Gelb" weil durch das löschen von Ordner "Rot" sich auch der Index verschoben hat! Deshalb würde es zu einem Fehler kommen. Also sollte man beim löschen immer Rückwärts vorgehen.

Ich hoffe das war verständlich.

Gruß
Tino


naleh - Do 06.11.03 20:26

jop wars
vielen dank


Tino - Fr 07.11.03 09:16

naleh hat folgendes geschrieben:
vielen dank

Gerne... dafür sind wir ja da :-D

Gruß
Tino