Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Datei bzw. Verzeichnis lässt sich nicht löschen (https://www.delphipraxis.net/103365-datei-bzw-verzeichnis-laesst-sich-nicht-loeschen.html)

wolle72 14. Nov 2007 20:22


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:
//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.
Kann mir dabei jemand helfen ?

Wolle

taaktaak 14. Nov 2007 21:18

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

wolle72 14. Nov 2007 21:30

Re: Datei bzw. Verzeichnis lässt sich nicht löschen
 
Zitat:

Zitat von taaktaak
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????

Hallo Ralph,
Das ganze soll rekursiv alles in dem befindlichen Verzeichnis inklusive allen Unterverzeichnissen löschen.
Viele Grüsse
Wolle

taaktaak 14. Nov 2007 21:38

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

Nuclear-Ping 14. Nov 2007 23:03

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:
                      if NOT DeleteFile(sFileName) then
                        sErrMess := SysErrorMessage(GetLastError);
                        writeln('Could NOT delete ' + sFileName + ' Error: ' + sErrMess);
Wer hier den Fehler findet, darf ihn korrigieren.

Tom 15. Nov 2007 05:48

Re: Datei bzw. Verzeichnis lässt sich nicht löschen
 
Zitat:

Zitat von Nuclear-Ping
Delphi-Quellcode:
                      if NOT DeleteFile(sFileName) then
                        sErrMess := SysErrorMessage(GetLastError);
                        writeln('Could NOT delete ' + sFileName + ' Error: ' + sErrMess);
Wer hier den Fehler findet, darf ihn korrigieren.

Es fehlt wohl ein begin und ein end ...

Nuclear-Ping 15. Nov 2007 09:58

Re: Datei bzw. Verzeichnis lässt sich nicht löschen
 
Yo, und deswegen ...
Zitat:

Zitat von wolle72
[...] Mein Tool sagt in vielen Fällen "Zugriff verweigert", [...]


wolle72 15. Nov 2007 20:14

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. :(

wolle72 15. Nov 2007 21:42

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:
//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.
Habe ich doch noch was vergessen ?

DeddyH 16. Nov 2007 08:54

Re: Datei bzw. Verzeichnis lässt sich nicht löschen
 
Schlecht:
Delphi-Quellcode:
if SearchRec.Attr = faDirectory then
Besser:
Delphi-Quellcode:
if (SearchRec.Attr and faDirectory) = faDirectory then


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:05 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz