![]() |
Datei bzw. Verzeichnis lässt sich nicht löschen
Hallo,
ich bin blutiger Anfänger in Delphi und versuche mich mit einem kleinen CMD-Tool. Ich will alle Dateien im Tempverzeichnis löschen die älter als 3 Tage sind. Das klappt leider nur zur Hälfte. Mein Tool sagt in vielen Fällen "Zugriff verweigert", allerdings hat Windows nach meinem Ermessen nicht die "Finger" drauf. Mit dem Explorer lassen sich diese problemlos löschen, warum dann nicht mit meinem Code ?
Delphi-Quellcode:
Kann mir dabei jemand helfen ?
//Delete all files/dirs in TempDir which ones are older than x days
program TempCleaner; {$APPTYPE CONSOLE} uses Windows,SysUtils; //Function Function MyRemoveDir(sDir : String; OlderThanDays : Integer) : Boolean; var iIndex : Integer; SearchRec : TSearchRec; sFileName,sErrMess : String; dtFileDirDate,dtNow : TDateTime; begin Result := False; sDir := sDir + '\*.*'; iIndex := FindFirst(sDir, faAnyFile, SearchRec); dtNow := Date; while iIndex = 0 do begin sFileName := ExtractFileDir(sDir)+'\'+SearchRec.Name; dtFileDirDate := FileDateToDateTime(SearchRec.Time); if trunc(dtNow - dtFileDirDate) + 1 > OlderThanDays then begin if SearchRec.Attr = faDirectory then begin if (SearchRec.Name <> '' ) and (SearchRec.Name <> '.') and (SearchRec.Name <> '..') then MyRemoveDir(sFileName,OlderThanDays); end else begin //if SearchRec.Attr <> faArchive then // FileSetAttr(sFileName, faArchive); if NOT DeleteFile(sFileName) then sErrMess := SysErrorMessage(GetLastError); writeln('Could NOT delete ' + sFileName + ' Error: ' + sErrMess); end; end; iIndex := FindNext(SearchRec); end; FindClose(SearchRec); RemoveDir(ExtractFileDir(sDir)); Result := True; end; //Mainproggi var temp_dir : string; begin temp_dir := SysUtils.GetEnvironmentVariable('temp'); //writeln(temp_dir); //MyRemoveDir('D:\Temp\test\test', 3); MyRemoveDir(temp_dir, 3); end. Wolle |
Re: Datei bzw. Verzeichnis lässt sich nicht löschen
Moin, Moin Wolle,
ohne auf die Frage direkt zu antworten: Wenn du gezielt Dateien aus einem dir bekannten Verzeichnis löschen willst und dessen Namen auch an deine Rouine übergibts - wozu erfolgt dann innerhalb dieser Prozedur eine rekursiver Aufruf derselben???? Gruß Ralph |
Re: Datei bzw. Verzeichnis lässt sich nicht löschen
Zitat:
Das ganze soll rekursiv alles in dem befindlichen Verzeichnis inklusive allen Unterverzeichnissen löschen. Viele Grüsse Wolle |
Re: Datei bzw. Verzeichnis lässt sich nicht löschen
Moin Wolle,
da habe ich "zu kurz" gedacht - bringt dich aber natürlich auch nicht weiter, sorry. Gibt es denn irgendwelche "Regelmäßigkeiten" oder "Merkmale" welche Dateien sich nicht löschen lassen? Gruß Ralph |
Re: Datei bzw. Verzeichnis lässt sich nicht löschen
Delphi-Quellcode:
if SearchRec.Attr = faDirectory then begin
if (SearchRec.Name <> '' ) and (SearchRec.Name <> '.') and (SearchRec.Name <> '..') then MyRemoveDir(sFileName,OlderThanDays); end else begin //if SearchRec.Attr <> faArchive then // FileSetAttr(sFileName, faArchive); if NOT DeleteFile(sFileName) then sErrMess := SysErrorMessage(GetLastError); writeln('Could NOT delete ' + sFileName + ' Error: ' + sErrMess); end;
Delphi-Quellcode:
Wer hier den Fehler findet, darf ihn korrigieren.
if NOT DeleteFile(sFileName) then
sErrMess := SysErrorMessage(GetLastError); writeln('Could NOT delete ' + sFileName + ' Error: ' + sErrMess); |
Re: Datei bzw. Verzeichnis lässt sich nicht löschen
Zitat:
|
Re: Datei bzw. Verzeichnis lässt sich nicht löschen
Yo, und deswegen ...
Zitat:
|
Re: Datei bzw. Verzeichnis lässt sich nicht löschen
Danke soweit mal für den Tipp. :-D Das scheint auf alle Fälle logisch zu klingen. Sieht bis dato aber so aus, wie wenn da einiges ned ganz mit dem begin...end stimmt. Momentan bekomme ich es leider nicht mal mehr fehlerfrei kompiliert - hab wohl an der falschen Schraube gedreht. :(
|
Re: Datei bzw. Verzeichnis lässt sich nicht löschen
So ich denke jetzt müsste es passen. Allerdings bekomme ich immer noch die selbe Fehlermeldung. Hier der aktuelle Code.
Delphi-Quellcode:
Habe ich doch noch was vergessen ?
//Delete all files/dirs in TempDir which ones are older than x days
program TempCleaner; {$APPTYPE CONSOLE} uses Windows,SysUtils; //Function Function MyRemoveDir(TargetDir : String; OlderThanDays : Integer) : Boolean; var iIndex : Integer; SearchRec : TSearchRec; FoundName,ErrMess : String; DateFileDirDate,DateNow : TDateTime; begin Result := False; TargetDir := TargetDir + '\*.*'; iIndex := FindFirst(TargetDir, faAnyFile, SearchRec); DateNow := Date; while iIndex = 0 do begin FoundName := ExtractFileDir(TargetDir)+'\'+SearchRec.Name; DateFileDirDate := FileDateToDateTime(SearchRec.Time); if trunc(DateNow - DateFileDirDate) + 1 > OlderThanDays then begin if SearchRec.Attr = faDirectory then begin if (SearchRec.Name <> '' ) and (SearchRec.Name <> '.') and (SearchRec.Name <> '..') then begin MyRemoveDir(FoundName,OlderThanDays); end; end else begin if NOT DeleteFile(FoundName) then begin ErrMess := SysErrorMessage(GetLastError); writeln('Could NOT delete ' + FoundName + ' Error: ' + ErrMess); end; end; end; iIndex := FindNext(SearchRec); end; FindClose(SearchRec); RemoveDir(ExtractFileDir(TargetDir)); Result := True; end; //Mainproggi var temp_dir : string; begin temp_dir := SysUtils.GetEnvironmentVariable('temp'); //writeln(temp_dir); //MyRemoveDir('D:\Temp\test\test', 1); MyRemoveDir(temp_dir, 3); end. |
Re: Datei bzw. Verzeichnis lässt sich nicht löschen
Schlecht:
Delphi-Quellcode:
Besser:
if SearchRec.Attr = faDirectory then
Delphi-Quellcode:
if (SearchRec.Attr and faDirectory) = faDirectory then
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:43 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