![]() |
File löschen und umbenennen geht nicht
Hi,
nach langer Zeit plagt mich mal wieder ein Problem, bei dem ich zur Zeit etwas auf dem Schlauch stehe, weil es einfach nicht funktioniert. Womöglich ist die Lösung auch viel einfacher, als ich momentan glaube. Es geht darum, dass ich mir eine Art Launcher gebastelt habe, der unter anderem auch die aktuelle Programmversion anzeigt, die ich in einer .Ini vermerkt habe. Nun ist es so, dass zum Beispiel mit einem Update auch eine neue Versionsnummer kommt, die ich in einer .Ini dem gedownloadeten Update gerne mitgeben möchte: Folgender Codeausschnitt:
Delphi-Quellcode:
Wie wahrscheinlich aus dem Codeschnipsel ersichtlich soll, sofern es eine Ini "vers_patch" gibt, die Ini "vers_aktuell" gelöscht werden und die "vers_patch" Ini dann in "vers_aktuell" umbenannt werden. Wenn ich jedoch das Programm starte, ändert sich nichts. Die Versionsnummer ist immernoch die alte und die Datei "vers_patch.ini" ist auch noch vorhanden.
procedure TForm7.FormShow(Sender: TObject);
var Ini : TIniFile; begin if FileExists(ExtractFilePath(Application.ExeName)+'vers_patch.ini') then begin Ini:=TIniFile.Create(ExtractFilePath(ParamStr(0))+'vers__patch.ini'); try deletefile(ExtractFilePath(Application.ExeName)+'vers_aktuell.ini'); renamefile(ExtractFilePath(Application.ExeName)+'vers_patch.ini',(ExtractFilePath(Application.ExeName)+'vers_aktuell.ini')); finally FreeAndNil(Ini); end; end; Abgefragt wird das ganze etwas weiter unten im Text:
Delphi-Quellcode:
Wäre sehr dankbar, wenn ihr mir ein bisschen auf die Sprünge helfen könntet, was ich verändern könnte, um das Problem zu lösen.
var Ini : TIniFile;
begin if FileExists(ExtractFilePath(Application.ExeName)+'vers_aktuell.ini') then begin Ini:=TIniFile.Create(ExtractFilePath(ParamStr(0))+'vers_aktuell.ini'); try Image7.Width:=240; Label9.Caption:=Ini.ReadString('verstitle','title',''); //Auslesen und Anzeigen der Versionsnummer finally FreeAndNil(Ini); end; end; |
AW: File löschen und umbenennen geht nicht
Hallo Störtebeker,
warum öffnest Du die Ini-Datei ohne etwas damit zu machen, und führst dann die Delete/Rename Aktionen auf dieser geöffneten Ini-Datei durch ? Außerdem fehlt bei Dir irgendwie in beiden Codeschnipseln ein "end"......?! Kein Fehler, aber warum verwendest Du mal Application.ExeName und dann wieder ParamStr(0) ? Noch ein Tip zur Lesbarkeit: wenn Du z.B. "ExtractFilePath(Application.ExeName)+'vers_patch. ini'" mehrfach brauchst, dann belege 1 mal ein stringvariable damit. Last but not least würde ich eine Extra-Methode zum umbenennen der Datei machen, und diese Methode im FormShow aufrufen (also nicht Code direkt im FormShow). Versuche mal statt
Delphi-Quellcode:
einfach nur dieses:
procedure TForm7.FormShow(Sender: TObject);
var Ini : TIniFile; begin if FileExists(ExtractFilePath(Application.ExeName)+'vers_patch.ini') then begin Ini:=TIniFile.Create(ExtractFilePath(Application.ExeName)+'vers__patch.ini'); try deletefile(ExtractFilePath(Application.ExeName)+'vers_aktuell.ini'); renamefile(ExtractFilePath(Application.ExeName)+'vers_patch.ini',(ExtractFilePath(Application.ExeName)+'vers_aktuell.ini')); finally FreeAndNil(Ini); end; end;
Delphi-Quellcode:
Grüsse,
procedure TForm7.CheckForPatchFile;
var patchfilename, currentfilename: string; begin patchfilename := ExtractFilePath(Application.ExeName)+'vers_patch.ini'; if not FileExists(patchfilename) then exit; currentfilename := ExtractFilePath(Application.ExeName)+'vers_aktuell.ini'; deletefile(currentfilename); renamefile(patchfilename, currentfilename); end; procedure TForm7.FormShow(Sender: TObject); begin CheckForPatchFile; end; blauweiss |
AW: File löschen und umbenennen geht nicht
Moin,
und hast du Schreibrechte in den Ordner? MfG Fabian |
AW: File löschen und umbenennen geht nicht
Hallo,
Zitat:
Lege mal ein c:\temp oder falls mehrere Laufwerke vorhanden sind, z.B. ein e:\temp an und starte die Exe von dort. Klappt es dort, hast du deine Exe wohl im Programme-Verzeichnis stehen, dort hast du keine Schreibrechte. Die Ini gehört dort nicht hin Suche hier nach "Special Folders". So am Rande: Warum steht x-mal ExtractFilePath im Code statt zwei String-Variablen zu nehmen und die Dateinamen einmal zuzuweisen. Heiko |
AW: File löschen und umbenennen geht nicht
Danke für eure Tipps und Hinweise, werde mal schauen, wie ich damit weiterkomme.
Das ganze läuft auf Windows XP (vorerst), und beiden Datein, sowohl die Exe, als auch die beiden Inis liegen in ein und dem selben Verzeichnis in einem Ordner innerhalb des "Eigene Datein" Ordner. EDIT: Ne, bringt leider auch nichts, auch wenn es natürlich schöner aussieht im Code. Aber löscht weder die eine File, noch überschreibt er die andere. |
AW: File löschen und umbenennen geht nicht
Delphi-Quellcode:
Ich bin gerade echt am verzweifeln... :cry: ...ich weiß nicht, aber es scheint, als würde sich Delphi um diesen Codeschnipsel gar nicht kümmern. Kein Löschen der File, kein Umbenennen der File.
procedure TForm7.CheckForPatchFile;
var patchfile, currentfile: string; begin patchfile := ExtractFilePath(Application.ExeName)+'vers_patch.ini'; currentfile := ExtractFilePath(Application.ExeName)+'vers_aktuell.ini'; if not FileExists(patchfile) then exit; deletefile(currentfile); renamefile(patchfile, currentfile); end; Aufgerufen wird die CheckForPatchFile Procedure etwas später bei einem Timer:
Delphi-Quellcode:
Timer2 wird im FormShow Ereignis gestartet
procedure TForm7.Timer2Timer (Sender: TObject);
begin Label9.Caption:='Patching...'; Form7.Caption:='0%'; begin if FileExists(ExtractFilePath(Application.ExeName)+'vers_patch.ini') then CheckForPatchFile; Timer3.Enabled:=True; end; end;
Delphi-Quellcode:
procedure TForm7.FormCreate(Sender: TObject);
begin Label9.Caption:='Loading...'; Timer2.Enabled:=True; end; |
AW: File löschen und umbenennen geht nicht
Hallo,
erstmal: den Code
Delphi-Quellcode:
im "Timer2Timer" kannst du dir ersparen, denn
if FileExists(ExtractFilePath(Application.ExeName)+'vers_patch.ini') then
das gleiche, über einen anderen Weg macht dieser Code in der Procedure CheckForPatchFile:
Delphi-Quellcode:
Lass dir doch erstmal die Rückgabewerte zurückmelden:
if not FileExists(patchfile) then exit;
Delphi-Quellcode:
Die ShowMessages zeigen dir was los ist, ob das Lösen funktionierte bzw. das Umbenennen.
procedure TForm7.CheckForPatchFile;
var patchfile, currentfile: string; begin patchfile := ExtractFilePath(Application.ExeName)+'vers_patch.ini'; currentfile := ExtractFilePath(Application.ExeName)+'vers_aktuell.ini'; if not FileExists(patchfile) then ShowMessage(Format('Datei existiert nicht: %s', [patchfile])); exit; If not deletefile(currentfile) then begin ShowMessage('löschen fiel fehl!'); exit; end; If not renamefile(patchfile, currentfile) then begin ShowMessage('Umbenennen fiel fehl!'); exit; end; ShowMessage('alles scheint in Ordnung gewesen zu sein!'); end; |
AW: File löschen und umbenennen geht nicht
Tja, irgendwas ist da noch im argen, da ich auch keine Rückmeldungen bekomme. Es passiert einfach nix.
|
AW: File löschen und umbenennen geht nicht
SchowMessage ist ja eher unglücklich, vorallem wenn diese in einem Timer auftauchen ... Exceptions sind doch auch nett?
Und ich würde auch noch
Delphi-Quellcode:
in die Messages/Exceptions einbauen.
SysErrorMessage(GetLastError)
[edit] Bist du sicher, diese Methode (Timerereignis) wird aufgerufen? Nur weil eine Methode Timer2Timer heißt, muß sie nicht mit dem timer2 verknüpft sein und der Timer muß auch nicht unbedingt aktiv sein. Ich schlage für sowas immer etwas sehr Praktisches vor und das nennt sich Debuggen. |
AW: File löschen und umbenennen geht nicht
Setz halt mal beim Aufruf von
Delphi-Quellcode:
einen Breakpoint und schau ob das Programm dort überhaupt aufgerufen wird und wenn ja, dann jumpe einfach mit F7 mal weiter.
CheckForPatchFile
Was für einen Intervall hast du beim Timer 2? Ruf halt mal die Procedure
Delphi-Quellcode:
über einen Button auf. Um festzustellen ob was geht
CheckForPatchFile
|
AW: File löschen und umbenennen geht nicht
Timer 2 hat ein Intervall von 3500 und er scheint die CheckForPatchFile Prozedur nicht aufzurufen. Beim Click auf den Button keine Reaktion.
Wenn ich Breakpoints setze,
Delphi-Quellcode:
...werden DeleteFile und RenameFile einfach übersprungen, er springt dann auch nach einem weiteren Druck auf F7 sofort zum "end;" von Timer2Timer und dann in die Unit "CostumTimer" hierhin:
procedure TForm7.CheckForPatchFile;
var patchfile, currentfile: string; begin patchfile := ExtractFilePath(Application.ExeName)+'vers_patch.ini'; currentfile := ExtractFilePath(Application.ExeName)+'vers_aktuell.ini'; if not FileExists(patchfile) then exit; deletefile(currentfile); renamefile(patchfile, currentfile); end;
Delphi-Quellcode:
procedure TCostumTimer.DoOnTimer;
if Assigned(FOnTimer) then FOnTimer(Self); end; EDIT: Das Löschen funzt jetzt. Habe aus DeleteFile(currentfile); einfach DeleteFile(PChar(currentfile)); gemacht. Jetzt muss ich nur noch am rename knabbern. Da bekomme ich den Fehlercode = 2. |
AW: File löschen und umbenennen geht nicht
Und was heißt Fehlercode 2?
![]() |
AW: File löschen und umbenennen geht nicht
Ja, ich weiß, dass es der Code für "File not found" ist. Aber es wird ja die noch existierende "vers_patch.ini" umbenannt und nicht die "vers_aktuell.ini", die gelöscht wird.
Auch wenn ich bei renamefile(patchfile,...'vers_aktuell.ini') eingebe, bekomme ich diesen Fehler. |
AW: File löschen und umbenennen geht nicht
Statt Löschen und Umbenennen kannst Du es auch einmal mit
![]() [edit]Also etwa so:
Delphi-Quellcode:
procedure TForm7.CheckForPatchFile;
var patchfile, currentfile: string; begin patchfile := ExtractFilePath(Application.ExeName)+'vers_patch.ini'; if FileExists(patchfile) then begin currentfile := ExtractFilePath(Application.ExeName)+'vers_aktuell.ini'; if not MoveFileEx(PChar(patchfile),PChar(currentfile),MOVEFILE_REPLACE_EXISTING or MOVEFILE_WRITE_THROUGH) then raise Exception.Create(SysErrorMessage(GetLastError)); end; end; |
AW: File löschen und umbenennen geht nicht
Oh mein Gott, :wall::wall: Kann ich noch irgendwo meinen Kopf gegenhauen :lol:
Das RenameFile hätte die ganze Zeit funktioniert, wenn ich gleich gesehen hätte, dass die eigentliche "vers_patch.ini" im Ordner -> "vers__patch.ini" hieß. Und da er ja im Quelltext nach einer "vers_patch.ini" sucht, kann er sie natürlich nicht finden. Da habe ich wohl beim erstellen der Datei einen Unterstrich zu viel eingebaut. :oops: |
AW: File löschen und umbenennen geht nicht
Drum legt man gerne auch eine Konstante für solche Namen an ... da sind überall die Namen gleich.
|
AW: File löschen und umbenennen geht nicht
Properties/Funktionen wären aber auch noch eine Möglichkeit, solche Fehler zu vermeiden. Auch hier kann man ja dann Konstanten verwenden.
Delphi-Quellcode:
Man kann das auch noch weiter treiben und eine weitere Funktion schreiben, die den Pfad zurückgibt.
function PatchFileName: string;
const ININAME = 'vers_patch.ini'; begin Result := ExtractFilePath(ParamStr(0)) + ININAME; end; function CurrentFileName: string; const ININAME = 'vers_aktuell.ini'; begin Result := ExtractFilePath(ParamStr(0)) + ININAME; end; procedure TForm7.CheckForPatchFile; var patchfile, currentfile: string; begin patchfile := PatchFileName; if FileExists(patchfile) then begin currentfile := CurrentFileName; if not MoveFileEx(PChar(patchfile),PChar(currentfile),MOVEFILE_REPLACE_EXISTING or MOVEFILE_WRITE_THROUGH) then raise Exception.Create(SysErrorMessage(GetLastError)); end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:28 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz