![]() |
Re: Einen Ordner komplett löschen
Danke!
Das war der fehler! |
Re: Einen Ordner komplett löschen
Es gibt bereits sooo viele Threads zu dem Thema, daß ich mir einfach mal DEN hier rauspicke:
Thema: RemoveDir funzt nicht! Unterthema: RemoveDir funzt manchmal(!) nicht. Ich habe alle Threads in der DP wieder und wieder durchgelesen. Viele nutzen diese SHFileOperation-Funktion. Leider ruft die aber "ZeroMemory" oder sowas auf und mein Delphi 5 kann damit nichts anfangen. Also habe ich die Funktionen von SirThornberry "DeleteFiles" und "DeleteDirectory" benutzt, in der Hoffnung, daß diese besser tun, als meine eigenen. Naja, es war ein Versuch wert. Folgendes Problem: Ich lege im Programm (per Button-Klick) mit "ForceDirectories(Dir)" Verzeichnisse an, in die ich mit "CopyFile" Dateien hinein kopiere. Gleich im nächsten Schritt (natürlich nur in der Testphase) lösche ich (per Button-Klick) alle gerade angelegten Verzeichnisse inklusive aller in ihnen enthaltenen Dateien wieder. In allen Fällen werden restlos alle Dateien gelöscht. ABER: Nur in 50 Prozent der Fälle werden auch alle Verzeichnisse gelöscht! In den anderen 50 Prozent läßt das Programm ein paar LEERE Verzeichnisse zurück. Um nichts in der Welt ist mein Programm hinterher nochmal dazu zu bewegen, diese Leichen ebenfalls noch zu entfernen! Lösche ich sie jedoch von Hand und starte einen neuen Durchlauf, mit den gleichen Startbedingungen, dann stehen die Chancen 1:2 daß diesmal alle Verzeichnisse gelöscht werden. Lege ich von Hand Verzeichnisse an, löscht das Programm sie niemals! Der folgende Quellcode kann von Euch so nicht ausprobiert werden, da Euch alle selbst geschrieben Methoden u.ä. fehlen. Er dient nur dazu, ein bißchen einen Überblick zu bekommen was ich tue... Zum Kopieren:
Delphi-Quellcode:
Zum Löschen:
// Suche in jedem ...
for iDvzIdx := 0 to ZSI.iGetAnzUnterDVZ - 1 do begin // ... der angegebenen Unter-Verzeichnisse ... if ZSI.bGetUnterDvzStatus((ZSI.slGetUnterDVZ)[iDvzIdx]) = TRUE then begin // ... nach jedem ... for iTypIdx := 0 to ZSI.iGetAnzTypenAM - 1 do begin // ... der ausgewählten Datei-Typen ... if ZSI.bGetDateiTypStatus((ZSI.slGetDateiTypenAM)[iTypIdx]) = TRUE then begin // ... und kopiere diese in´s Ziel-Verzeichnis. sQuelle := ZSI.sGetQuellDVZ + (ZSI.slGetUnterDVZ)[iDvzIdx] + '\'; sTeilVerzeichnis := ZSI.sGetUnterDVZ_OhneErstes((ZSI.slGetUnterDVZ)[iDvzIdx]); sZiel := ZSI.sGetZielDVZ + '\' + sTeilVerzeichnis + '\'; if SindFilesinDir(sQuelle, '*.' + (ZSI.slGetDateiTypenAM)[iTypIdx], TRUE) = TRUE then begin DirErzeugen(sZiel); sDatei := '*.' + (ZSI.slGetDateiTypenAM)[iTypIdx]; CopyFiles(sQuelle, sZiel, sDatei, FALSE); end; end; // end - if end; // end - for end; // end - if end; // end - for
Delphi-Quellcode:
Meine Frage:
function TFrmZipSave.DeleteDirectory(ADirName: String): Boolean;
var LRec : TSearchRec; begin DeleteFiles(ADirName + '\*'); if FindFirst(ADirName + '\*', faDirectory, LRec) = 0 then begin repeat if (copy(LRec.name, 1, 1) <> '.') and DirectoryExists(ADirName + '\' + LRec.Name) then DeleteDirectory(ADirName + '\' + LRec.Name) ; until FindNext(LRec) <> 0; end; SysUtils.FindClose(LRec); result := RemoveDir(ADirName); if result = TRUE then begin iAnzDvzGeloescht := iAnzDvzGeloescht + 1; pnlErgebnis.Caption := IntToStr(iAnzDateienWeg) + ' Dateien und ' + IntToStr(iAnzDvzGeloescht) + ' Verzeichnisse gelöscht...'; Application.ProcessMessages; end; end; {*** DeleteDirectory ***} procedure TFrmZipSave.DeleteFiles(FilenameMask: String); var LRec : TSearchRec; LPath : String; bResult : Boolean; begin if FindFirst(FilenameMask, faAnyFile + $80 + $2000, LRec) = 0 then begin LPath := ExtractFilePath(FilenameMask); repeat if (LRec.Name <> '.') and (LRec.Name <> '..') then begin // ggf. Schreibschutz entfernen If (LRec.Attr and SysUtils.faReadOnly) <> 0 then FileSetAttr(LPath + LRec.Name, LRec.Attr - SysUtils.faReadOnly) ; bResult := SysUtils.DeleteFile(LPath + LRec.Name); if bResult = TRUE then begin iAnzDateienWeg := iAnzDateienWeg + 1; pnlErgebnis.Caption := IntToStr(iAnzDateienWeg) + ' Dateien und ' + IntToStr(iAnzDvzGeloescht) + ' Verzeichnisse gelöscht...'; Application.ProcessMessages; end; end; until FindNext(LRec) <> 0; end; SysUtils.FindClose(LRec); end; {*** DeleteFiles ***} Woran kann es liegen, daß RemoveDir mal tut und mal nicht? Gibt es vielleicht irgendwelche DateiAttribute, die ich noch abfragen sollte? |
Re: Einen Ordner komplett löschen
Zitat:
![]() |
Re: Einen Ordner komplett löschen
@Glühwürmchen
Button1 auf Form legen. C:\test anlegen Einige Dateien unter C:\test rein. Stetze einige Dateien auf Hidden oder Versteckt. Button1 betätigen und Du wirst sehen: Alles gelöscht! Selbst gerade probiert. Ich glaube DelDir ist Torrycode.
Delphi-Quellcode:
Und: Geht es jetzt?
function DelDir(dir: string): Boolean; {$IFDEF INLINE}INLINE;{$ENDIF}
var fos: TSHFileOpStruct; begin ZeroMemory(@fos, SizeOf(fos)); with fos do begin wFunc := FO_DELETE; fFlags := FOF_SILENT or FOF_NOCONFIRMATION; pFrom := PChar(dir + #0); end; Result := (0 = ShFileOperation(fos)); end; procedure TForm1.Button1Click(Sender: TObject); begin DelDir('C:\test'); if DirectoryExists('C:\test') then ShowMessage('DelDir fehlgeschlagen') else ShowMessage('DelDir funktioniert'); end; Gruß Go2EITS |
Re: Einen Ordner komplett löschen
@Go2EITS
Undefinierter Bezeichner: 'TSHFileOpStruct' Was ist TorryCode? @luckie FillChar? Habe die Hilfe gelsen, aber - was soll ich damit? |
Re: Einen Ordner komplett löschen
ShellAPI eingebunden?
|
Re: Einen Ordner komplett löschen
@Glühwürmchen
Sorry, hab nicht aufgepasst und Uses mitgeteilt. Filectrl unter USES für Directoryexits einfügen. Torrycode? Damit meine ich die hervorragenden Snippets für Delphi hier: ![]() (Sucheseite) unter Tips kannst Du die die Kategorie "manuell" auswählen. |
Re: Einen Ordner komplett löschen
ShellAPI und FileCtrl einzubinden haben das Compiler-Problem gelöst.
Aber das Programm tut nicht. Alle rüberkopierten Dateien sind weg. Das Verzeichnis wiedersteht jedoch dem Löschversuch: "DelDir fehlgeschlagen" (ABER ES IST DA!!) |
Re: Einen Ordner komplett löschen
Was liefert denn SHFileOperation für einen Fehlercode zurück?
|
Re: Einen Ordner komplett löschen
hm, bei zwei weiteren Versuchen ging es.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:16 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 by Thomas Breitkreuz