Autor Beitrag
bbBowser
Hält's aus hier
Beiträge: 7



BeitragVerfasst: Fr 03.07.09 13:18 
Hallo alle zusammen,
ich lese per FindFirst und FindNext ein Verzeichnis aus und fülle damit einen TreeView und speichere alles in Stringlisten. Das Problem ist, dass anscheinend nicht jede Datei wirklich gefunden wird, nach meinem Ermessen unabhängig von Name, Grösse usw. - Woran kann das liegen?

Hier noch ein Auszug aus meinem Code:

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:
procedure TForm1.IdSendDir(DirPath: string);
var SearchResult : TSearchRec; i: integer;
begin
  
  ExtractStrings(['\','/'], [' '], PChar(DirPath), LastDirsList);

  TreeView1.items.AddFirst(nil, LastDirsList.Strings[0]).ImageIndex := 0;
  i:=1;
  while i <= LastDirsList.count-1 do
  begin
    TreeView1.items.AddChild(TreeView1.items.Item[i-1], LastDirsList.Strings[i]).ImageIndex := 1;
    i:=i+1;
  end;
  setcurrentdir(DirPath);
  FindFirst('*', faAnyFile, SearchResult);
  repeat
    FindNext(searchResult);
    if searchResult.attr and faDirectory = 16 then
    begin
      TreeView1.items.AddChild(TreeView1.items.Item[i-1], searchResult.name).ImageIndex := 1;
      DirList.Add(searchResult.name);
    end else
    begin
      TreeView1.items.AddChild(TreeView1.items.Item[i-1], searchResult.name).ImageIndex := 2;
      FileList.Add(searchResult.name);
      SizeList.Add(inttostr(searchResult.size));
    end;
  until FindNext(searchResult) <> 0;

  FindClose(searchResult);
  TreeView1.items[0].Expand(true);


thx Carsten
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Fr 03.07.09 13:21 
Moin und :welcome: im Forum!

Ohne mir den Code genauer angesehen zu haben - was hat dieses FindNext denn da zu suchen?
user profile iconbbBowser hat folgendes geschrieben Zum zitierten Posting springen:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
[...]
  setcurrentdir(DirPath); // was hat das für einen Sinn?
  FindFirst('*', faAnyFile, SearchResult);
  repeat
    FindNext(searchResult);
    if searchResult.attr and faDirectory = 16 then
    begin
      TreeView1.items.AddChild(TreeView1.items.Item[i-1], searchResult.name).ImageIndex := 1;
      DirList.Add(searchResult.name);
    end else
    begin
      TreeView1.items.AddChild(TreeView1.items.Item[i-1], searchResult.name).ImageIndex := 2;
      FileList.Add(searchResult.name);
      SizeList.Add(inttostr(searchResult.size));
    end;
  until FindNext(searchResult) <> 0;

  FindClose(searchResult);
  TreeView1.items[0].Expand(true);

//EDIT: Weiterhin wertest du das Ergebnis von FindFirst() nicht aus! :idea:

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.


Zuletzt bearbeitet von Narses am Fr 03.07.09 13:26, insgesamt 1-mal bearbeitet
Nersgatt
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1581
Erhaltene Danke: 279


Delphi 10 Seattle Prof.
BeitragVerfasst: Fr 03.07.09 13:23 
ich weiß leider nicht genau, in welcher Reihenfolge Delphi das auswertet, daher setze ich hier grundsätlich Klammern:

ausblenden Delphi-Quelltext
1:
    if (searchResult.attr and faDirectory) = 16 then					

_________________
Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
bbBowser Threadstarter
Hält's aus hier
Beiträge: 7



BeitragVerfasst: Fr 03.07.09 13:48 
Danke für die Tipps, vorallem das mit dem nicht ausgewerteten FindFirst is mir garnich aufgefallen :oops: . Allerdings hab ich das jetzt korrigiert, sowie die Klammern gesetzt. Trotzdem findet er von rund 22 Dateien(Ordner und Files) nur 18(vorher 17, weil ich das FindFirst vergessen hab). SetCurrentDir hab ich benutzt damit dirpath(zu durchsuchendes Verzeichnis) durchforstet wird. Wenn ich stattdessen FindFirst(DirPath+'\*' ... verwende kommt das selbe Ergebnis raus.
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Fr 03.07.09 14:12 
Moin!

Ich glaube, du solltest mal bei user profile iconLuckies Suche in: Delphi-Forum, Delphi-Library DRIVETOOLS reinsehen, bevor wir hier zum x-ten mal den Code einer Directory-Suche analysieren. :les: :think: ;)

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
jfheins
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 918
Erhaltene Danke: 158

Win 10
VS 2013, VS2015
BeitragVerfasst: Fr 03.07.09 14:15 
Falls es immernoch Dateien gibt, die nicht gefunden werden obwohl sie das sind: Sind die vielleicht komprimiert oder verschlüsselt?

Um das auszuschließen kannst du statt faAnyFile mal folgendes einsetzen:
ausblenden Delphi-Quelltext
1:
2:
const 
faNewAnyFileEx = $00017FFF; // Wirklich alles


Siehe dazu dieser Thread: www.delphipraxis.net...c149497,0,asc,0.html
Popov
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1655
Erhaltene Danke: 13

WinXP Prof.
Bei Kleinigkeiten D3Pro, bei größeren Sachen D6Pro oder D7
BeitragVerfasst: Fr 03.07.09 15:27 
ausblenden Delphi-Quelltext
1:
 setcurrentdir(DirPath); // was hat das für einen Sinn?					


Die Funktion legt das aktuelle Verzeichnis fest. Allerdings solltest du nicht mit einem aktuellen Verzeichnis arbeiten, da sich der auch mal ändern kann.

Ich suche so Ordner:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
  if FindFirst(Path + '*.*', faDirectory, Search) = 0 then
  begin
    repeat
      if ((Search.Attr and faDirectory) = faDirectory) and (Search.Name[1] <> '.') then
        ###MACH_WAS###(Path + Search.Name);
    until FindNext(Search) <> 0;

    FindClose(Search);
  end;


Andere Dateien:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
    if FindFirst(Path + '*.*', Attrib, Search) = 0 then
    repeat
      ###MACH_WAS###(Path + Search.Name);
    until FindNext(Search) <> 0;


Wobei ich das noch vergessen habe:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
var
  Attrib: Integer;
  Search: TSearchRec;
begin
  Attrib := faArchive + faReadOnly + faHidden;

_________________
Popov
nagel
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 708

Win7, Ubuntu 10.10

BeitragVerfasst: Fr 03.07.09 22:38 
user profile iconNersgatt hat folgendes geschrieben Zum zitierten Posting springen:
ich weiß leider nicht genau, in welcher Reihenfolge Delphi das auswertet, daher setze ich hier grundsätlich Klammern:

ausblenden Delphi-Quelltext
1:
    if (searchResult.attr and faDirectory) = 16 then					

And kommt vor =, also sind die Klammern nicht nötig. Aber lieber zuviel Klammern gesetzt als zu wenig ;) .