| Autor |
Beitrag |
hansa
      
Beiträge: 3079
Erhaltene Danke: 9
|
Verfasst: Di 02.09.03 21:21
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; |
_________________ Gruß
Hansa
|
|
Michael Stenzel
      
Beiträge: 133
D3 Prof, D7 PE
|
Verfasst: 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 
      
Beiträge: 3079
Erhaltene Danke: 9
|
Verfasst: 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?
_________________ Gruß
Hansa
|
|
Horst
      
Beiträge: 120
|
Verfasst: 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

|
|
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: 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 - es wird zwar nichts gelöscht, aber das Prinzip ist das selbe, da ich ja den Pfad der gefundenen Dateien ebenfalls anzeigen lasse).
|
|
hansa 
      
Beiträge: 3079
Erhaltene Danke: 9
|
Verfasst: 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; |
_________________ Gruß
Hansa
|
|
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Do 04.09.03 08:10
Ich geb´s auf ...  ... @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 
      
Beiträge: 3079
Erhaltene Danke: 9
|
Verfasst: Do 04.09.03 12:50
Hi,
ja wo nix ist ist nix.  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); |
_________________ Gruß
Hansa
|
|
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Do 04.09.03 12:58
Weil du immer noch kein Verzeichnis angibst.  - 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 
      
Beiträge: 3079
Erhaltene Danke: 9
|
Verfasst: Do 04.09.03 13:27
Gut, das war wohl zu kurz. So sieht das ganze momentan aus:
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.  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.
_________________ Gruß
Hansa
|
|
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: 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.
|
|