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.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.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!