Entwickler-Ecke

Dateizugriff - Delphi 7: FindFirst und Archivbit - es geht einfach nicht


Lemmy - Mo 12.07.10 20:02
Titel: Delphi 7: FindFirst und Archivbit - es geht einfach nicht
Hallo,

ich versuche in einem Verzeichnis die Dateien ausfindig zu machen, bei denen das Archivbit gesetzt ist:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
  var SR : TSearchRec;
    iSearchAtt:Integer;
  begin
    if FindFirst(AFilePath + '*.*', faAnyFile-faArchive, SR) = 0 then try
      repeat
        if (SR.Name <> '.'and (SR.Name <> '..'then begin
          Form1.Memo1.Lines.Add(sr.Name);
        end;
      until FindNext(SR) <> 0;
    finally
      FindClose(SR);
    end;
  end;

Das Problem ist, er listete mir immer alle Dateien auf, also nicht nur die mit dem Archivbit. Seltsam dabei ist auch, dass die Abbriva-Zipkomponenten an der selben Stelle auch ein Problem haben, d.h. wenn ich beim Hinzufügen von Dateien zum Archiv faArchvie angebe, dann werden dennoch alle Dateien gezippt.

Unter der KOmmandozeile kann ich mir die Dateien korrekt anzeigen lassen (DIR /A:A)

Oder sind diese beiden "Archive" nicht identisch? Ich hoffe, dass hier jemand Licht ins Dunkle bringen kann....

GRüße

Moderiert von user profile iconNarses: Code- durch Delphi-Tags ersetzt


ZeitGeist87 - Mo 12.07.10 20:05

musst das nicht + oder AND statt - heißen? :gruebel:


jaenicke - Mo 12.07.10 20:16

Um genau zu sein bringen mathematische Operatoren hier nix. In diesem Fall wäre es and not statt dem Minuszeichen.

Aber du willst ja gerade Dateien mit Archivbit, du nimmst aber genau die heraus aus der Suche...

Wie sieht es so aus:

Delphi-Quelltext
1:
2:
    if FindFirst(AFilePath + '*.*', faArchive, SR) = 0 then
      try
Außerdem kannst du ja auf das Attribut auch nach der Suche testen.


Lemmy - Mo 12.07.10 23:05

Hi,

sorry das war ein Copy-Paste Fehler, ich habe so viel ausprobiert....

@jaenick: auch den Source habe ich getestet. Es kommen auch da alle Dateien. Wie gesagt, mein Latein hört da auf. Klar kann ich auch das Attribut auch noch später prüfen, aber spätestens wenn ich die Zipkomponente einsetze geht es wieder schief, außer ich fange an, jede einzelne Datei hinzuzufügen.... Ich schlaf jetzt mal ne Nacht drüber...


Gerd Kayser - Di 13.07.10 00:12

Beispiel:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
procedure TForm1.Button1Click(Sender: TObject);
var
  Search : TSearchRec;
  Verz   : String;
begin
  Verz := 'h:\';
  Memo1.Clear;
  if FindFirst(Verz + '*.*', faAnyFile, Search) = 0 then
    try
      repeat
        if (Search.Attr and faArchive) = faArchive then
          Memo1.Lines.Add(Search.Name);
      until
        FindNext(Search) <> 0;
    finally
      SysUtils.FindClose(Search);
    end;
end;

Die Attribute werden beim Aufruf von FindFirst nicht ausgewertet. Also muß das Ergebnis danach gefiltert werden. Bei FindClose sollte man SysUtils davor setzen, weil es die Funktion zweimal gibt (Windows und SysUtils).


Lemmy - Di 13.07.10 07:57

Guten Morgen,

user profile iconGerd Kayser hat folgendes geschrieben Zum zitierten Posting springen:
Beispiel:
Die Attribute werden beim Aufruf von FindFirst nicht ausgewertet. Also muß das Ergebnis danach gefiltert werden. Bei FindClose sollte man SysUtils davor setzen, weil es die Funktion zweimal gibt (Windows und SysUtils).


ich bekomem gleich Krätze...

Vielen Dank an euch alle!!!

Grüße