Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi DeleteFile löscht gewünschte Datei nicht (https://www.delphipraxis.net/158825-deletefile-loescht-gewuenschte-datei-nicht.html)

Metallicwar 4. Mär 2011 12:33

DeleteFile löscht gewünschte Datei nicht
 
Hallo, wie der Titel schon sagt, wird die gewünschte Datei nicht gelöscht, könnt ihr mir mal bitte sagen wieso?
Delphi-Quellcode:
procedure TfrmBankenDownload.ZIPAusführen;
var
  sExePfad, sZIPPfad: String;
begin
  sZIPPfad := ExtractFilePath(ParamStr(0))+'Bankdaten.zip';
  TRY
    ftpDateiDownload.Get('Bankdaten.zip',sZIPPfad, true);
  EXCEPT
    on E: Exception do
    ShowMessage('Beim Download der ZIP Datei ist ein Fehler aufgetreten.' + sLineBreak +
                'Exception class name = '+E.ClassName + sLineBreak +
                'Exception message = '+E.Message);
  END;
  TRY
    begin
      sExePfad := ExtractFilePath(Application.ExeName);
      AbZIPEntpacken.FileName := sZIPPfad;
      AbZIPEntpacken.BaseDirectory := (sExePfad+'Bankdaten');
      AbZIPEntpacken.ExtractFiles('*.*');
      Application.ProcessMessages;
      SysUtils.DeleteFile(sZIPPfad); // <------- ZIP Datei wird nicht gelöscht.
    end;
  EXCEPT
    on E: Exception do
    begin
      ShowMessage('Es ist ein Fehler beim Entpacken der ZIP Datei aufgetreten.' + sLineBreak +
                  'Exception class name = '+E.ClassName + sLineBreak +
                  'Exception message = '+E.Message);
    end;
  END;
  AbZIPEntpacken.Free;
end;
Desweiteren erhalte ich, nachdem ich die Anwendung zur Laufzeit ein zweites mal ausführe (Button klicken --> Anweisungen werden ausgeführt, nochmal Button klicken --> selbe Anweisungen nochmal ausführen) eine Zugriffsverletzung in Zeile
Delphi-Quellcode:
AbZIPEntpacken.FileName := sZIPPfad;
Vielleicht kann mir da noch weitergeholfen werden, ohne ein neues Thema zu eröffnen

himitsu 4. Mär 2011 12:35

AW: DeleteFile löscht gewünschte Datei nicht
 
Vermutlich weil AbZIPEntpacken diese noch geöffnet hat?

PS: DeleteFile hat ein Result und kennt GetLastError
PSS: Warum eigentlich einmal Application.ExeName und dann wieder ParamStr(0) ?

Und die Exception:
Du gibst AbZIPEntpacken frei, aber wo erstellst du es?

Metallicwar 4. Mär 2011 12:43

AW: DeleteFile löscht gewünschte Datei nicht
 
Hallo himitsu,
Zitat:

Vermutlich weil AbZIPEntpacken diese noch geöffnet hat?
ich muss dazu sagen, dass die vorhergehenden Anweisungen ausgeführt werden.
Er speichert die Datei im richtigem Verzeichnis und entpackt sie dort auch, nur eben das Löschen der ZIP Datei funktioniert nicht.

Zitat:

PSS: Warum eigentlich einmal Application.ExeName und dann wieder ParamStr(0) ?
ehm habe zu Beginn mit Application.ExeName gearbeitet, ein Kollege hat mir dann ParamStr gezeigt ;)

und dazu:
Zitat:

Und die Exception:
Du gibst AbZIPEntpacken frei, aber wo erstellst du es?
habe das Free entfernt, nun meckert er, nachdem ich erneut den button anklicke, dass der Ordern Bankdaten.zip nicht erstellt werden kann.
Liegt aber vermutlich daran, dass der Ordner bereits existiert, daher möchte ich ihn ja löschen.

wicht 4. Mär 2011 12:47

AW: DeleteFile löscht gewünschte Datei nicht
 
Mach "SysUtils.DeleteFile(sZIPPfad);" nach "AbZIPEntpacken.Free;" ....
Ausserdem den anderen Rat von himi auch beachten. Das AbZIPEntpacken.Create() sollte eigentlich direkt über das zweite "try".

HTH

Metallicwar 4. Mär 2011 12:57

AW: DeleteFile löscht gewünschte Datei nicht
 
also das Löschen funktioniert jetzte.
aber es tritt immer noch der Fehler beim zweiten Klick auf (Zugriffsverletzung)
Ich erzeuge die Komponenten nicht zur Laufzeit, als Zusatzinfo.
Delphi-Quellcode:
AbZIPEntpacken.Create(Self);
verstehe daher nicht, wieso ich meine ZIP Komponente nochmals erzeugen soll?

himitsu 4. Mär 2011 12:59

AW: DeleteFile löscht gewünschte Datei nicht
 
Zitat:

Zitat von Metallicwar (Beitrag 1085863)
habe das Free entfernt, nun meckert er, nachdem ich erneut den button anklicke, dass der Ordern Bankdaten.zip nicht erstellt werden kann.
Liegt aber vermutlich daran, dass der Ordner bereits existiert, daher möchte ich ihn ja löschen.

Es wird nun aus genau dem selben Grund gemeckert, weswegen die Datei vorher auch nicht gelöscht werden konnte.
> Du hast über .FileName dem AbZIPEntpacken gesagt, es soll diese Datei öffnen/verwenden und das macht es auch, bis du was Anderes sagst.

Hast du dir mal das Result, GetLastError und SysErrorMessage angesehn?


Zitat:

Delphi-Quellcode:
AbZIPEntpacken.Create(Self);

Wie erzeugt man Objekte?
Delphi-Quellcode:
AbZIPEntpacken := TAbZIPEntpacken.Create(Self);
.

Und wenn du es freigibst, dann ist es weg, also neu erstellen, aber wenn du es manuell erstellst, dann darfst du nicht die Komponente auf die Form legen,
also nicht automatisch von der VCL erstellen lassen, wärend sie die Form erstellt.

Bjoerk 4. Mär 2011 13:12

AW: DeleteFile löscht gewünschte Datei nicht
 
Kann sein, daß dein Antivierenprogramm die Datei noch nicht freigibt.
Auf jeden Fall mal das free vor dem delete probieren.
Statt des Application.ProcessMessages mal ein sleep(1) versuchen (zwischen free und delete).

Hast du AbZIPEntpacken:=TZipDingens.Create irgendwo stehen ?

Assarbad 4. Mär 2011 13:16

AW: DeleteFile löscht gewünschte Datei nicht
 
Zitat:

Zitat von Bjoerk (Beitrag 1085871)
Kann sein, daß dein Antivierenprogramm die Datei noch nicht freigibt.

Sehr unwahrscheinlich. Der Scan ist üblicherweise abgeschlossen sobald die Datei erfolgreich geöffnet ist.

Ansonsten empfehle ich MSDN-Library durchsuchenMoveFileEx mit MOVEFILE_DELAY_UNTIL_REBOOT.

himitsu 4. Mär 2011 13:21

AW: DeleteFile löscht gewünschte Datei nicht
 
Zitat:

Zitat von Assarbad (Beitrag 1085872)
Ansonsten empfehle ich MSDN-Library durchsuchenMoveFileEx mit MOVEFILE_DELAY_UNTIL_REBOOT.

War das nicht das, wofür man Adminrechte benötigt?

PS: Der Schuldige ist nicht der Virenscanner oder Sonstwer, sondern AbZIPEntpacken.

Metallicwar 4. Mär 2011 13:27

AW: DeleteFile löscht gewünschte Datei nicht
 
Zitat:

Zitat von Bjoerk (Beitrag 1085871)
Kann sein, daß dein Antivierenprogramm die Datei noch nicht freigibt.
Auf jeden Fall mal das free vor dem delete probieren.
Statt des Application.ProcessMessages mal ein sleep(1) versuchen (zwischen free und delete).

Hast du AbZIPEntpacken:=TZipDingens.Create irgendwo stehen ?

Das mit dem Antivirenprogramm bezweifle ich.
das mit dem sleep werd ich mal probieren.

TZipDingens.Create hab ich nirgends stehen, habe doch erwähnt dass ich die Komponente nicht zur Laufzeit erzeuge.


Zitat:

Zitat von Metallicwar:
habe das Free entfernt, nun meckert er, nachdem ich erneut den button anklicke, dass der Ordern Bankdaten.zip nicht erstellt werden kann.


Liegt aber vermutlich daran, dass der Ordner bereits existiert, daher möchte ich ihn ja löschen.
Es wird nun aus genau dem selben Grund gemeckert, weswegen die Datei vorher auch nicht gelöscht werden konnte.
> Du hast über .FileName dem AbZIPEntpacken gesagt, es soll diese Datei öffnen/verwenden und das macht es auch, bis du was Anderes sagst.

Hast du dir mal das Result, GetLastError und SysErrorMessage angesehn?


Zitat:
AbZIPEntpacken.Create(Self);
Wie erzeugt man Objekte?
AbZIPEntpacken := TAbZIPEntpacken.Create(Self); .

Und wenn du es freigibst, dann ist es weg, also neu erstellen, aber wenn du es manuell erstellst, dann darfst du nicht die Komponente auf die Form legen,
also nicht automatisch von der VCL erstellen lassen, wärend sie die Form erstellt.
ok, werd die Komponente mal zur Laufzeit erzeugen, und P.s ja ich weis wie man Objekte erzeugt :)

das mit GetLastError muss ich mal schaun wie's funktioniert. F1 sollte weiterhelfen ;)

Bjoerk 4. Mär 2011 13:31

AW: DeleteFile löscht gewünschte Datei nicht
 
wenn du das mit dem Antivirenprogramm bezweifeslt, dann kannst du dir das mit dem sleep sparen.:-D

himitsu 4. Mär 2011 13:35

AW: DeleteFile löscht gewünschte Datei nicht
 
nimm' lieber Delphi-Referenz durchsuchenSysErrorMessage oder gleich Hier im Forum suchenSysErrorMessage :angle2:
> http://www.delphipraxis.net/158106-r...parameter.html (da DeleteFile = RenameFile, nja fast, paßt es ja)

Metallicwar 4. Mär 2011 13:39

AW: DeleteFile löscht gewünschte Datei nicht
 
Delphi-Quellcode:
procedure TfrmBankenDownload.ZIPAusführen;
var
  sExePfad, sZIPPfad: String;
  AbZIPEntpacken : TAbUnZipper;
begin
  sZIPPfad := ExtractFilePath(ParamStr(0))+'Bankdaten.zip';
  TRY
    ftpDateiDownload.Get('Bankdaten.zip',sZIPPfad, true);
  EXCEPT
    on E: Exception do
    ShowMessage('Beim Download der ZIP Datei ist ein Fehler aufgetreten.' + sLineBreak +
                'Exception class name = '+E.ClassName + sLineBreak +
                'Exception message = '+E.Message);
  END;
  TRY
    begin
      AbZIPEntpacken := TAbUnZipper.Create(Self);
      sExePfad := ExtractFilePath(Application.ExeName);
      AbZIPEntpacken.FileName := sZIPPfad;
      AbZIPEntpacken.BaseDirectory := (sExePfad+'Bankdaten');
      AbZIPEntpacken.ExtractFiles('*.*');
      Application.ProcessMessages;
    end;
  EXCEPT
    on E: Exception do
    begin
      ShowMessage('Es ist ein Fehler beim Entpacken der ZIP Datei aufgetreten.' + sLineBreak +
                  'Exception class name = '+E.ClassName + sLineBreak +
                  'Exception message = '+E.Message);
    end;
  END;
  AbZIPEntpacken.Free;
  SysUtils.DeleteFile(sZIPPfad);
  ftpDateiDownload.Disconnect;
end;
also so wie's aussieht, lag schon von himitsu vermutet, an der ZIP Komponente, hab sie jetzte mal zur Laufzeit erzeugt und siehe da, es funktioniert !

Vielen Dank für die Hilfe ! :dp:

Lemmy 4. Mär 2011 13:43

AW: DeleteFile löscht gewünschte Datei nicht
 
Hi,

ein AbZipXX.close hätte vor dem Delete vermutlich auch schon ausgereicht...

Grüße

himitsu 4. Mär 2011 13:44

AW: DeleteFile löscht gewünschte Datei nicht
 
Wenn diese Komponente ordentlich geschrieben ist, sollte man auch irgendwie die Datei wieder schließen/freigeben können.

Ich kenn diese allerdings nicht, aber eventuell gibt es ja sowas wie
Delphi-Quellcode:
AbZIPEntpacken.CloseFile
oder
Delphi-Quellcode:
AbZIPEntpacken.FileName := '';

Assarbad 4. Mär 2011 13:50

AW: DeleteFile löscht gewünschte Datei nicht
 
Zitat:

Zitat von himitsu (Beitrag 1085875)
War das nicht das, wofür man Adminrechte benötigt?

Wäre mir neu.

himitsu 4. Mär 2011 13:55

AW: DeleteFile löscht gewünschte Datei nicht
 
Zitat:

Zitat von Assarbad (Beitrag 1085890)
Wäre mir neu.

Dort http://www.delphipraxis.net/89932-mo...tml#post610573 hat irgendwer ( :stupid: ) geschrieben, daß die zu löschenden Dateien in
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Contro l\Session Manager\FileRenameOperations eingetragen werden und braucht man für HKEY_LOCAL_MACHINE nicht nicht gewisse Rechte?

Assarbad 4. Mär 2011 14:12

AW: DeleteFile löscht gewünschte Datei nicht
 
Zitat:

Zitat von himitsu (Beitrag 1085891)
Zitat:

Zitat von Assarbad (Beitrag 1085890)
Wäre mir neu.

Dort http://www.delphipraxis.net/89932-mo...tml#post610573 hat irgendwer ( :stupid: ) geschrieben, daß die zu löschenden Dateien in
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Contro l\Session Manager\FileRenameOperations eingetragen werden und braucht man für HKEY_LOCAL_MACHINE nicht nicht gewisse Rechte?

Daß die da eingetragen werden ist schon korrekt (es ist wohl ein Schlüssel und ein Wert die da potentiell infrage kommen). Allerdings hatte ich aus Konten heraus die wenig Rechte hatten nie ein Problem damit das Hinzuzufügen. Aber hast recht, ist mal ne interessante Frage der ich gleich mal mit IDA auf den Grund gehen werde ;)

Metallicwar 4. Mär 2011 14:17

AW: DeleteFile löscht gewünschte Datei nicht
 
Zitat:

Zitat von himitsu (Beitrag 1085887)
Wenn diese Komponente ordentlich geschrieben ist, sollte man auch irgendwie die Datei wieder schließen/freigeben können.

Ich kenn diese allerdings nicht, aber eventuell gibt es ja sowas wie
Delphi-Quellcode:
AbZIPEntpacken.CloseFile
oder
Delphi-Quellcode:
AbZIPEntpacken.FileName := '';


CloseFile gibts nicht. und den FileName leer setzen, hab ich nicht probiert.

Aber diese Komponente ist nicht gut geschrieben, hat mein Kollege bestätigt. Er empfiehlt http://www.componentace.com/zip_comp...i_zipforge.htm

Lemmy 4. Mär 2011 14:35

AW: DeleteFile löscht gewünschte Datei nicht
 
Zitat:

Zitat von Metallicwar (Beitrag 1085901)

CloseFile gibts nicht. und den FileName leer setzen, hab ich nicht probiert.

Wie schon oben beschrieben heißt die Methode in der aktuellen Version Close;

Zitat:

Zitat von Metallicwar (Beitrag 1085901)
Aber diese Komponente ist nicht gut geschrieben, hat mein Kollege bestätigt. Er empfiehlt http://www.componentace.com/zip_comp...i_zipforge.htm

sicherlich keine schlechte Entscheidung....

Assarbad 4. Mär 2011 16:40

AW: DeleteFile löscht gewünschte Datei nicht
 
MoveFileExW -> MoveFileWithProgressW -> BasepMoveFileDelayed

Dort wird dann der Registryschlüssel geöffnet und das kann in der Tat schiefgehen wenn der Benutzer nicht alle Rechte auf diesen Schlüssel besitzt, wie es aussieht. Hast also recht, himitsu.

Luckie 4. Mär 2011 18:54

AW: DeleteFile löscht gewünschte Datei nicht
 
Die ursprüngliche Aussage, dass man dazu Administratorenrechte benötigt stammt übrigens von jemanden, der hier mal als Olli abgemeldet war. ;)

Assarbad 4. Mär 2011 19:30

AW: DeleteFile löscht gewünschte Datei nicht
 
Zitat:

Zitat von Luckie (Beitrag 1085970)
Die ursprüngliche Aussage, dass man dazu Administratorenrechte benötigt stammt übrigens von jemanden, der hier mal als Olli abgemeldet war. ;)

Seltsam. Kenne den Typen nicht. :stupid:

himitsu 4. Mär 2011 19:34

AW: DeleteFile löscht gewünschte Datei nicht
 
meine implizite Erwähnung dessen hat man bestimmt übersehn :cry:

Luckie 4. Mär 2011 19:40

AW: DeleteFile löscht gewünschte Datei nicht
 
Nicht schlimm. Ist nur ein unbedeutendes Licht in der Delphi Szene. Habe gehört er sitzt jetzt auf einen vulkanischen Felsen im Nordatlantik. :tongue:


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:47 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