Autor Beitrag
hansa
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3079
Erhaltene Danke: 9



BeitragVerfasst: 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".

ausblenden 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;

_________________
Gruß
Hansa
Michael Stenzel
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 133


D3 Prof, D7 PE
BeitragVerfasst: Mi 03.09.03 00:32 
Hallo.

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

ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3079
Erhaltene Danke: 9



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 120



BeitragVerfasst: Mi 03.09.03 21:01 
Hi,

mit Hilfe von Extractfilepath kannst du den Pfad ermitteln:


ausblenden 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:
ausblenden Quelltext
1:
datname := ExtractFilePath(sr.name)+sr.name;					


Gruß

Horst
:wave:
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3079
Erhaltene Danke: 9



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

ausblenden 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



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3079
Erhaltene Danke: 9



BeitragVerfasst: 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:

ausblenden 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



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3079
Erhaltene Danke: 9



BeitragVerfasst: Do 04.09.03 13:27 
Gut, das war wohl zu kurz. So sieht das ganze momentan aus:

ausblenden volle Höhe 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.

_________________
Gruß
Hansa
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



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