Entwickler-Ecke

Dateizugriff - Dateien löschen


hansa - Di 02.09.03 21:21
Titel: Dateien löschen
Hi,

wer sieht hier einen Fehler ? Ich lese die Dateien in ein Stringgrid ein und will die mit 0 Byte löschen. Lande ich in der Schleife mit sr.size = 0 bei dem erase, dann heißt es "Datei nicht gefunden".


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
procedure TForm1.Button1Click(Sender: TObject);
var d  : Textfile;
    sr : TSearchRec;
begin
  if FindFirst ('\*.*',faAnyFile,sr) = 0 then repeat
    if sr.Attr <> faDirectory then begin
      if sr.size = 0 then begin
showmessage (sr.Name);
        AssignFile (d,sr.name);
        erase (d);
      end
      else begin
        StringGrid1.Cells [0,StringGrid1.Row] := sr.Name;
        StringGrid1.Cells [1,StringGrid1.Row] := IntToStr (sr.size);
//      StringGrid1.Cells [2,StringGrid1.Row] := IntToStr (sr.time);
        StringGrid1.RowCount := StringGrid1.RowCount + 1;
        StringGrid1.Row := StringGrid1.Row + 1;
      end;
    end;
  until FindNext(sr) <> 0;
  FindClose(sr);
end;


Michael Stenzel - Mi 03.09.03 00:32

Hallo.

Du gibst beim löschen nicht das richtige Verzeichnis an.
Versuch es mal da mit.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
var Datname : string;
// ... 

if FindFirst ('\*.*',faAnyFile,sr) = 0 then repeat 
    if sr.Attr <> faDirectory then begin
      if sr.size = 0 then begin 
      Datname := "\"+sr.name;
showmessage (Datname);
 
        AssignFile (d,datname); 
        erase (d); 
      end


Code ist nicht geprüft.

mfg
Michael.


hansa - Mi 03.09.03 12:10

Gebe ich den vollständigen Pfadnamen an, gehts tatsächlich. Jetzt gehts aber weiter: der zeigt mir nur den Dateinamen selber an, bei "sr.name". Wie komme ich nun an den Pfad?


Horst - Mi 03.09.03 21:01

Hi,

mit Hilfe von Extractfilepath kannst du den Pfad ermitteln:



Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
function ExtractFilePath(const FileName: string): string;

Beschreibung

Der resultierende String enthält die Zeichen von FileName bis 
einschließlich des Doppelpunkts oder des umgekehrten Schrägstrichs, mit 
dem die Pfadinformationen vom Dateinamen und seinere Erweiterung 
abgetrennt wird. Sind in FileName keine Laufwerks- und 
Verzeichnisinformationen vorhanden, wird ein leerer String 
zurückgegeben.


Der Source müsste dann so ähnlich aussehen:

Quelltext
1:
datname := ExtractFilePath(sr.name)+sr.name;                    


Gruß

Horst
:wave:


Delete - Mi 03.09.03 23:14

Das Problem ist (und das hast du überlesen), dass "sr.Name" aber eben nur den Dateinamen enthält: ohne Pfad. Aus dem Grund setze ich bei solchen Aktionen das gewünschte Verzeichnis immer vorher (s. bspw. auch hier [http://www.delphi-forum.de/viewtopic.php?t=15203] - es wird zwar nichts gelöscht, aber das Prinzip ist das selbe, da ich ja den Pfad der gefundenen Dateien ebenfalls anzeigen lasse).


hansa - Do 04.09.03 01:38

Hi,

das mit ExtractFilePath sieht am logischsten aus. Das Stringgrid habe ich durch ein Memo ersetzt. Es wird aber nur ** angezeigt.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
begin
  i := 0;
  if FindFirst ('\*.*',faAnyFile,sr) = 0 then repeat
    i := i + 1;
    Form1.Memo1.Lines.Add (IntToStr (i)+'  *'+ExtractFilePath (sr.Name)+'*');
  until FindNext(sr) <> 0;
  FindClose(sr);
end;


Delete - Do 04.09.03 08:10

Ich geb´s auf ... :roll: ... @hansa: Denk mal bitte logisch! ExtractFilePath ist eine simple Copy/Pos-Variante, die aus einem übergebenen Dateinamen den Pfad extrahiert. Was soll das Ergebnis sein, wenn du einen Dateinamen ohne Pfad angibst?


hansa - Do 04.09.03 12:50

Hi,

ja wo nix ist ist nix. :idea: Matthias hats mir ja jetzt erklärt. Habe mir mal das GetDir ChDir usw. angesehen. Ist schon klar. Nur wieso löscht der immer noch nichts:


Delphi-Quelltext
1:
2:
3:
4:
5:
    if (sr.Attr = faArchive) and (sr.size = 0) then begin
showmessage (inttostr (ord (sr.Attr))+' lösche: '+sr.Name+'  '+IntToStr (sr.Size));
      i := i + 1;
      assign (d,sr.name);
      erase (d);


Delete - Do 04.09.03 12:58

Weil du immer noch kein Verzeichnis angibst. :roll: - Nichts für ungut, aber mit den Infos, die du mittlerweile hast, hätte dein Problem schon seit gestern um 23 Uhr 14 gelöst sein müssen. Im Prinzip eierst du nur noch um den eigentlichen Fehler herum.


hansa - Do 04.09.03 13:27

Gut, das war wohl zu kurz. So sieht das ganze momentan aus:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
procedure LoescheLeereDateien (mask : string);
var d  : Textfile;
    sr : TSearchRec;
    st : string;
begin
  if FindFirst (mask,faArchive,sr) = 0 then repeat
    GetDir (0,st);
<span style="font-weight: bold">    if (sr.Attr = faArchive) and (sr.size = 0) then begin</span>
showmessage (inttostr (ord (sr.Attr))+' lösche: '+sr.Name+'  '+IntToStr (sr.Size));
      i := i + 1;
      assign (d,sr.name);
      erase (d);
    end;
  until FindNext(sr) <> 0;
  FindClose(sr);
end;

procedure TForm1.FormShow(Sender: TObject);
var sr : TSearchRec;
    st : string;
    i  : integer;
begin
  i := 0;
  ChDir ('\');
  SucheVerzeichnisse ('*.*');
  LoescheLeereDateien ('*.*');
  for i := 1 to ListBox1.Items.Count-1 do begin
showmessage ('Wechsle nach : '+ListBox1.Items[i]);
    ChDir ('\'+ListBox1.Items[i]);
    LoescheLeereDateien ('*.*');
  end;
  showmessage (IntToStr (i));
end;


Sieht zwar aus, wie Kraut und Rüben, müßte aber gehen, was es nicht tut. 8) Zur Erläuterung: Zuerst einmal gehe ich in die root und liste alle Verzeichnisse in einer Listbox auf. Die wander ich dann durch, wechsle das Verzeichnis immer von der root ausgehend! Unter-Unter-...-Verzeichnisse gehen natürlich nicht. Lösche ich alle Dateien mit 2 Byte, geht das schon, aber mit 0 Byte eben nicht.


Delete - Do 04.09.03 14:07

Bevor ich lange in deinem Quelltext rumfummle, verweise ich dich lieber an die FAQs vom DF. Da gibt es zwei Varianten, wie man FindFirst und Co. Dateien sucht und dabei auch untergeordnete Verzeichnisse berücksichtigt.

Anstelle der sonst üblichen Anzeige der Dateien schreibst du eben den Lösch-Code rein. Voilà.

btw: Du solltest daran denken, dass manche Dateien schreibgeschützt, versteckt oder ... sonst was ... sind. Vor dem Löschen also die Attribute zurücksetzen.