Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi RenameFile(oldFile, newFile) (https://www.delphipraxis.net/70194-renamefile-oldfile-newfile.html)

qb-tim 26. Mai 2006 15:53


RenameFile(oldFile, newFile)
 
Delphi-Quellcode:
//..
  s := ListBox1.Items.GetText;
  t := InputBox('Buch ändern', s, '');
  if t <> '' then
    if MessageDlg('''' + s + ''' zu ''' + t + ''' ändern?', mtConfirmation, [mbYes, mbNo], 0) = mrYes then
    begin
      f := 'C:\Program Files\Vokabeltrainer XXL\' + t;
      g := 'C:\Program Files\Vokabeltrainer XXL\' + s;
      RenameFile(g, f);
    end;
Das ist ein Ausschnitt aus einem Vokabeltrainer. In dieser Prozedur wird ein Ordner umbennant. Das funktioniert aber NIE. Wieso? Beide Ordnernamen + -pfade sind korrekt!

qb-tim 26. Mai 2006 16:07

Re: RenameFile(oldFile, newFile)
 
Noch etwas stimmt in meinem Programm nicht:

Delphi-Quellcode:
//..
  s := ListBox1.Items.GetText;
  if MessageDlg('Wollen Sie ' + s + ' wirklich löschen?', mtWarning, [mbYes, mbNo], 0) = mrYes then
  begin
    s := 'C:\Program File\Vokabeltrainer XXL\' + s;
    RemoveDir(s);
  end;
Liegt da ein Zusammenhang? :gruebel:

dahead 26. Mai 2006 16:23

Re: RenameFile(oldFile, newFile)
 
Wenn der restliche Code in deinem Programm auch so aussieht, stimmt sicherlich einiges nicht.

Du ermittelst mit Listbox.Items.GetText das aktuell markierte Item (was wohl eine Datei ist). Besser merkst du dir den kompletten Pfad in einem Array oder einer TStringList.

Auf einen Eintrag in einer Listbox greifst du so zu: Listbox1.Items[Listbox1.ItemIndex]. Vorher solltest du natürlich prüfen, ob überhaupt was markiert ist.

RemoveDir müsste eine Funktion sein, also einen Rückgabewert liefern. Diesen könntest du ggf. überprüfen und auswerten.
Edit: Willst du damit ein komplettes Verzeichnis löschen? Wenn ja, solltest du zuerst alle Dateien darin entfernen (Stichwort FindFiles) und dann das Verzeichnis löschen (RemoveDir).

Auch aufgefallen ist mit, dass es "C:\Program File" heisst, müsste egtl. "C:\Program Files" heissen. Zu diesem Thema solltest du keine fixen Pfade verwenden, sondern die Umgebungsvariablen auslesen. Was, wenn jemand ein dt. Windows mit "C:\Programme" hat?

qb-tim 26. Mai 2006 16:36

Re: RenameFile(oldFile, newFile)
 
Das Programm das ich schreibe speichert alle Ordner und Dateien in 'C:\Program Files\Vokabeltrainer XXL\...'. Es erstellt diese Ordner wenn sie nicht vorhanden sind.

Danke für die korrektur - ich überprüft ob es jetzt funktioniert...

qb-tim 26. Mai 2006 16:47

Re: RenameFile(oldFile, newFile)
 
Die Probleme bleiben aber noch:

Delphi-Quellcode:
procedure TForm3.EditBuchClick(Sender: TObject);
var f, g, s, t : String;
begin
  s := ListBox1.Items[ListBox1.ItemIndex];
  t := InputBox('Buch ändern', s, '');
  if t <> '' then
    if MessageDlg(s + ' zu ' + t + ' ändern?', mtConfirmation, [mbYes, mbNo], 0) = mrYes then
    begin
      f := 'C:\Program Files\Vokabeltrainer XXL\' + t;
      g := 'C:\Program Files\Vokabeltrainer XXL\' + s;
      RenameFile(g, f);
      Form3.FormActivate(Form3);
    end;
end;
Beispiel:

Das markierte "Buch" hat den Namen 'Buch 1' - dies ist ein Ordner ('C:\Program Files\Vokabeltrainer XXL\Buch 1') Da 'Buch 1' als s mit dem Pfad ausgestattet wird und da der neue Name (durch InputBox) auch mit dem Pfad versehen wird, müsste die Umbenennung (RenameFile) doch funktionieren, oder? Tut es aber nicht! Form3.FormActivate(Form3) ist eine Prozedur, die den ListBox auf den neusten Stand bringt...

Problem 2:

Delphi-Quellcode:
procedure TForm3.DelBuchClick(Sender: TObject);
var s : String;
begin
  s := ListBox1.Items[ListBox1.ItemIndex];
  if MessageDlg('Wollen Sie ' + s + ' wirklich löschen?', mtWarning, [mbYes, mbNo], 0) = mrYes then
  begin
    s := 'C:\Program Files\Vokabeltrainer XXL\' + s;
    RemoveDir(s);
  end;
  Form3.FormActivate(Form3);
end;
Beispiel wie vorhin:

Das markierte "Buch" hat den Namen 'Buch 1' - dies ist ein Ordner ('C:\Program Files\Vokabeltrainer XXL\Buch 1') Da 'Buch 1' als s mit dem Pfad ausgestattet wird sollte sie doch gelöscht werden können, oder? Tut es aber nicht! Find-Befehle zu benutzen um die darin zu löschenden Dateien und Ordner zu finden ist mir zu unständlich, da ich für jeden Ordner im Ordner im Ordner im Ordner ................ wiederum Find-Befehle zu schreiben ist viel zu viel!!!

:wall:

:cry:

Wieso werden die Ordner nicht umbenannt?
Wieso wird sogar ein leerer Ordner nicht gelöscht?
Wie kann ich einen ganzen Verzeichnis löschen, ohne endlos lange Quellentexte zu schreiben?

:gruebel:

qb-tim 26. Mai 2006 16:52

Re: RenameFile(oldFile, newFile)
 
DP Verhaltenskodex sagt: Nur eine Frage pro Thema - deshalb habe ich eine neue Frage zu dem löschen eines gesamten Verzeichnisses erstellt:

http://www.delphipraxis.net/internal...ct.php?t=84128

Bitte antworten dem Thema "gesamten Verzeichnis löschen" dahin posten. :wink:

thkerkmann 26. Mai 2006 16:55

Re: RenameFile(oldFile, newFile)
 
Hi,

schon mal bei den Schweizern gesucht ? :-)

hier guckst Du: zum löschen und schieben.

Viel Spass

Thomas

Sorry, hatte mich verkopiert ;-) jetzt sollte der Link funktionieren.

qb-tim 26. Mai 2006 17:01

Re: RenameFile(oldFile, newFile)
 
Was soll ich mit dem Link? Ich werde zu http://www.microsoft.com/ umgeleitet!

Klaus01 26. Mai 2006 17:06

Re: RenameFile(oldFile, newFile)
 
Zitat:

ind-Befehle zu benutzen um die darin zu löschenden Dateien und Ordner zu finden ist mir zu unständlich, da ich für jeden Ordner im Ordner im Ordner im Ordner ................ wiederum Find-Befehle zu schreiben ist viel zu viel!!!
Um solche Suchen zu erledigen, dazu gibt es recursive Suchen.

Grüße
Klaus

qb-tim 26. Mai 2006 17:17

Re: RenameFile(oldFile, newFile)
 
Diese Frage wird im oben genannten Thread / Thema behandelt.

Trotzdem, Danke.

Luckie 26. Mai 2006 17:20

Re: RenameFile(oldFile, newFile)
 
Zitat:

Zitat von qb-tim
Das Programm das ich schreibe speichert alle Ordner und Dateien in 'C:\Program Files\Vokabeltrainer XXL\...'. Es erstellt diese Ordner wenn sie nicht vorhanden sind.

Diesen Ordner gibt es bei mir nicht und ich würde sehr allergisch reagieren, wenn du diesen erstellen würdest, da dein Programm in das Progammsystemverzeichnis gehört und das ist unter einem deutschen Windows: C:\Programme.

qb-tim 26. Mai 2006 18:44

Re: RenameFile(oldFile, newFile)
 
Was ist nun bei meiner "Umbenennungs"-Prozedur falsch?
Wieso funktioniert sie nicht?

Klaus01 26. Mai 2006 19:56

Re: RenameFile(oldFile, newFile)
 
Hallo Tim,

bist Du Dir sicher, das keine Datei in dem Ordner geöffnet ist?

meine TestMethode funktioniert bei mir:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  renameFile('e:\ren Test','e:\ren Test2');
end;
oder so

Delphi-Quellcode:
procedure FileRename(oldFileName,newFileName:String);
var
  anyFile : File;
begin
  AssignFile(anyFile,oldFileName);
  rename(anyFile,newFileName);
end;
Kannst Du mal zu Kontrolle ausgeben welche Verzeichnisse du umbennen möchtest.
Ich denke da liegt Dein Fehler begraben.

Grüße
Klaus

qb-tim 27. Mai 2006 09:00

Re: RenameFile(oldFile, newFile)
 
Liste der Anhänge anzeigen (Anzahl: 1)
Der Ordner war am Zeitpunkt der Umbenennung völlig leer.

Ich habe die komplette Unit3 angehängt, damit du (wenn du Lust dazu hast) darin rumstöbern kannst.

Klaus01 27. Mai 2006 10:57

Re: RenameFile(oldFile, newFile)
 
Hallo Tim,

Delphi-Quellcode:
procedure TForm3.EditBuchClick(Sender: TObject);
var f, g, s, t : String;
begin
  s := ListBox1.Items[ListBox1.ItemIndex];
  t := InputBox('Buch ändern', s, '');
  if t <> '' then
    if MessageDlg(s + ' zu ' + t + ' ändern?', mtConfirmation, [mbYes, mbNo], 0) = mrYes then
    begin                                                 // <-- hier Breakpoint setzen
      f := 'C:\Program Files\Vokabeltrainer XXL\' + t;
      g := 'C:\Program Files\Vokabeltrainer XXL\' + s;
      RenameFile(g, f);
      Form3.FormActivate(Form3);
    end;
end;
setze doch mal einen Breakpoint an der markierten Stelle
und lass Dir die Variablen f und g einmal ausgeben.
Variablen anschauen geht wenn Du die Variable markierst und dann crtl-F5
drückst. Die Variable wird dann der Watchlist hinzugefügt.
In der Watchlist werden die Werte der Variablen ausgegeben.

Ich bin mal gespannt ob f und g die Werte haben, die Du Dir so vorstellst.

Was vielleicht auch nicht schlecht wäre, Deinen Sourcecode ein wenig mehr zu kommentieren
und den ganzen Listboxen und Buttons Namen zu geben unter den man sich auch was vorstellen kann.
So ist es so ziehmlich unmöglich Dein Programm zu verstehen.

Grüße
Klaus

qb-tim 27. Mai 2006 13:30

Re: RenameFile(oldFile, newFile)
 
Danke. Ich probier's gleich aus.

qb-tim 27. Mai 2006 13:47

Re: RenameFile(oldFile, newFile)
 
Etwas sehr merkwürdiges ist passiert:

Ich habe zuerst, ohne mein Programm zu ändern (nicht einmal Kommentare zu schreiben), mein Program getestet und es funktionierte NICHT.

Dann habe ich auf den Vorschlag von Klaus Kommentare geschreiben und den Breakpoint gesetzt.
:arrow: Das Programm hielt nicht an.

Ich habe dann den Breakpoint entfernt und das Programm noch einmal laufen lassen.

Die Umbenennung hat funktioniert! Sowie bei einem leeren als auch bei einem Ordner mit mehreren Dateien!

:angel:

qb-tim 27. Mai 2006 13:55

Re: RenameFile(oldFile, newFile)
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hier ist die funktionierende Version.

Ich habe mehr Kommententare hinzugefügt. - Ist das jetzt verständlicher?

Danke für eure Hilfe! :thumb: :wink: :zwinker:

:dp: :cheers: :dp:

semo 27. Mai 2006 15:27

Re: RenameFile(oldFile, newFile)
 
ich würde das ganze projekt oder zumindest die *.dfm-Datei mit zur *.pas-Datei posten beim nächsten Mal. Dann kann man auch sehen wie du das Formular aufgebaut hast.

Beim Überfliegen ist mir aufgefallen, dass du den Pfad 'C:\Program Files\Vokabeltrainer XXL\...' immer wieder aufrufst. Du solltets entweder eine Konstante per const definieren und diese aufrufen oder den Pfad deines Programms zur Laufzeit auslesen (zum Beispiel im FormCreate) und dieses in einer Variable festhalten, auf deren Inhalt du dann nach belieben zugreifen kannst.


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:28 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz