Avatar billede sorenriis Nybegynder
30. juni 2005 - 20:21 Der er 6 kommentarer og
1 løsning

Søge i undermapper

Jeg bruger i øjeblikket denne kode til at finde alle txt-filer.

if FindFirst('GameData/*.txt', faAnyFile, SearchResult1) = 0 then
  begin
    repeat
      TXTComboBox.Items.Add(searchResult1.Name);
    until FindNext(SearchResult1) <> 0;
  end;
FindClose(SearchResult1);

Men kan jeg få samme kode til at søge alle undermapper igennem også?
30. juni 2005 - 20:43 #1
Jeg bruger følgende i en backup routine jeg har lavet.
List er en TListBox.

procedure TForm1.FindFiler(S: String);
var
  Sr : TSearchRec;
  FileAttrs : Integer;
begin
  FileAttrs := 0;  // 0 for filer, 16 for mapper
  if FindFirst(S + '*.*', FileAttrs, Sr) = 0 then
  begin  // Opdater med nye filer.
    repeat
      if (Sr.Attr and FileAttrs) = FileAttrs then
        if Sr.Name[1] <> '.' then  // Navnet på nuværende eller øvre mappe.
        begin
          List.Items.Add(Copy(S+Sr.Name, Length(Fra)+1, Length(S+Sr.Name)));
        end;
    until FindNext(Sr) <> 0;
    FindClose(Sr);
  end;
  FileAttrs := 16;  // 0 for filer, 16 for mapper
  if FindFirst(S + '*.*', FileAttrs, Sr) = 0 then
  begin  // Opdater med nye mapper.
    repeat
      if (Sr.Attr and FileAttrs) = FileAttrs then
        if Sr.Name[1] <> '.' then  // Navnet på nuværende eller øvre mappe.
        begin
          FindFiler(S + Sr.Name + '\');
        end;
    until FindNext(Sr) <> 0;
    FindClose(Sr);
  end;
end;
30. juni 2005 - 20:45 #2
(S: String) i procedure hovedet er stien til den nuværende mappe.
Avatar billede kroning Nybegynder
30. juni 2005 - 21:15 #3
Jeg lavede engang denne til at finde en enkelt fil, men den kan hurtig laves om til at f.eks. retunere alle txt filer i f.eks. en StringList:

function FindFile(StartPath, FileName : string) : string;

procedure SearchDir(Path : string);
var
  sr: TSearchRec;
  fr : integer;
begin
    fr:=FindFirst(Path+'*.*', faAnyFile, sr);
    while (Result='') and (fr=0) do
    begin
        if (sr.Attr and faDirectory>0) and (sr.name<>'.') and (sr.name<>'..') then
    begin
        if FileExists(Path+sr.Name+'\'+FileName) then
            Result:=Path+sr.Name
            else
            SearchDir(Path+sr.Name+'\');
    end;
        fr:=FindNext(sr);
    end;
    FindClose(sr);
end;

begin
    Result:='';
  SearchDir(StartPath);
end;

-----------
Kaldes sådan:
  Edit1.Text:=FindFile('c:\','HORZTITL.GIF');
Avatar billede sorenriis Nybegynder
01. juli 2005 - 01:10 #4
Og de virker begge hvis der nu er flere undermapper?
Avatar billede kroning Nybegynder
01. juli 2005 - 01:56 #5
Ja
Avatar billede hrc Mester
09. juli 2005 - 20:20 #6
En god gammel traver på Eksperten. Søger man i svarene, så finder man sikkert de første 10 implementeringer af en rekursiv søgerutine. Den gir' points hver gang.. :-)
Avatar billede hrc Mester
26. juli 2005 - 11:30 #7
Søren Riis. Skal du ikke lukke dit spørgsmål?
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester