Delphi, Ordner löschen mit Inhalt
wenn ich Unterordner im Ordner - dieser code ist nicht Ordner löschen... gibt es da irgendwelche Fehler?
procedure TForm.Remove(Dir: String);
var
Result: TSearchRec; Found: Boolean;
begin
Found := False;
if FindFirst(Dir + '\*', faAnyFile, Result) = 0 then
while not Found do begin
if (Result.Attr and faDirectory = faDirectory) AND (Result.Name <> '.') AND (Result.Name <> '..') then Remove(Dir + '\' + Result.Name)
else if (Result.Attr and faAnyFile <> faDirectory) then DeleteFile(Dir + '\' + Result.Name);
Found := FindNext(Result) <> 0;
end;
FindClose(Result); RemoveDir(Dir);
end;
- Als ein beiseite, dieser code geschrieben werden kann, mit einer repeat-until-Schleife und somit vermeiden die Notwendigkeit für die
Found
lokale variable. - Auch, es ist ein bisschen komisch, dass
Found
istfalse
wenn eine Datei gefunden wurde, undtrue
wenn eine Datei nicht gefunden wurde... - Wenn eine der nachfolgenden Antworten dein problem gelöst hat, sollten Sie es akzeptieren, indem Sie auf die Häkchen Links neben der Antwort. Wenn mehr als eine Antwort dein problem gelöst ist, wählen Sie das 'beste' anzunehmen.
- Einige dups: stackoverflow.com/questions/16336761/..., stackoverflow.com/questions/11798783/...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn ich du wäre, würde ich nur sagen, das Betriebssystem zu löschen, der Ordner mit all seinem Inhalt. So tun, indem Sie schreiben (
uses ShellAPI
)[Wenn Sie
statt, erhalten Sie eine schöne Bestätigung dialog. Wenn Sie
erhalten Sie nicht den Bestätigungs-Dialog, aber Sie erhalten eine Fortschrittsanzeige, wenn die operation ist langwierig. Schließlich, wenn Sie fügen Sie die
FOF_ALLOWUNDO
Flagge, verschieben Sie das Verzeichnis in den Papierkorb, anstatt Sie dauerhaft zu löschen.Natürlich, Sie können kombinieren, Fahnen, wie Sie möchten:
zeigen keine Bestätigung (aber ein Dialogfeld mit dem Fortschritt, weil Sie nicht angeben
FOF_NO_UI
) und das Verzeichnis wird dann in den Papierkorb und nicht dauerhaft gelöscht.]const FOF_NO_UI = 1556;
.PChar('C:\Users\Andreas Rejbrand\Desktop\Test\'#0)
ist eher Bizarr. Was ist der deal? Schreiben SiePChar(Dir)
. Aber wenn Sie wurden mit einer wörtlichen dann könnte man einfach schreibenShOp.pFrom := 'C:\Users\Andreas Rejbrand\Desktop\Test\';
pFrom
Zeichenfolge muss doppelt null beendet. Soweit ich weiß, ohne Zusatz von#0
es ist nur garantiert, um am Ende mit einer einzigen null-Zeichen.PChar()
fehlte. THXDie einfachste Sache zu tun ist, rufen Sie
TDirectory.Delete(Dir, True)
.TDirectory
ist inIOUtils
das ist eine ganz neue RTL-Zusatz.Den
True
fahne übergeben wird, dieRecursive
parameter, was bedeutet, dass der Inhalt der Verzeichnisse sind empied vor dem Verzeichnis entfernt, einen wesentlichen Teil der das löschen von Verzeichnissen.In einem Kommentar, den Sie uns mitteilen, dass Sie mit Delphi 7 und, so kann dies nicht verwendet werden.
Dein code sieht meist gut. Sie müssen jedoch nicht bedeuten:
Ich denke du meinst:
Ich würde wahrscheinlich schreiben Sie es wie folgt:
End
,Try
, undFinally
!if (Result.Attr and faDirectory) = faDirectory
, Remy bekam es gleich in seiner version.Der letzten Zeit, die ich brauchte, um einen Ordner zu löschen mit Inhalte, die ich verwendet, die JCL:
Der Letzte parameter gibt an, ob die Dateien gehen in den Papierkorb oder nicht, das ist ein netter bonus.
DeleteDirectory
macht genau das, was Andreas Lösung ist: rufen SieSHFileOperation
. Aber wenn Sie schon mit der JCL Aufruf DeleteDirectory ist nur eine bequeme code-Zeile. Sollten Sie den Rückgabewert überprüfen, wenn.Adresse der ursprünglichen problem - versuchen Sie dies:
DSiWin32 ist open-source-Projekt relased mit "nutzen, wie Sie möchten" - Lizenz.