Avatar billede azs Nybegynder
27. december 2000 - 19:09 Der er 6 kommentarer og
1 løsning

Find alle mapper

Hvordan kan man finde alle mapper i et dir og så loade noget text fra hvert af dem ?

Jeg har en undermappe som f.eks. hedder \"mapper\" og i den er den f.eks. 4 eller 9 (det er forskelligt) andre mapper som hver indeholder en textfil, som der skal loades ind i mit program !

jeg vil så smide stien til hver mappe i en listbox, og så skal alt text loades ind i en memo !

hvordan kan man det ?
Avatar billede nico26 Nybegynder
28. december 2000 - 05:43 #1
her er et eksempel på hvordan man løber en mappes undermapper igennem

type
  TForm1 = class(TForm)
    ListBox1: TListBox;
    Memo1: TMemo;
    Button1: TButton;
    procedure ListBox1Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    function FindTxt(Path, Ext: string): TStringList;
    procedure Search(Path, Ext: string);
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

function TForm1.FindTxt(Path, Ext: string): TStringList;
var
  SR: TSearchRec;
begin
  Result := TStringList.Create;
  if FindFirst(Path + Ext, faArchive, SR) = 0 then
    try
      repeat
        Result.Add(Path + SR.Name);
      until FindNext(SR) <> 0;
    finally
      FindClose(SR);
    end;
end;

procedure TForm1.Search(Path, Ext: string);
var
  SR: TSearchRec;
  i: Integer;
  Strings: TStringList;
begin
  Path := Path + \'\\\';
  if FindFirst(Path + \'*.*\', faDirectory, SR) = 0 then
    try
      repeat
        if ((SR.Attr and faDirectory) <> 0) and (SR.Name[1] <> \'.\') then
        begin
          Strings := FindTxt(Path + SR.Name + \'\\\', Ext);
          try
            i := 0;
            while i < Strings.Count do
            begin
              ListBox1.Items.Add(Strings[i]);
              Inc(i);
            end;
          finally
            Strings.Free;
          end;
        end;
      until (FindNext(SR) <> 0);
    finally
      SysUtils.FindClose(SR);
    end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  ListBox1.Items.Clear;
  Search(GetCurrentDir, \'*.txt\');
end;

procedure TForm1.ListBox1Click(Sender: TObject);
begin
  with ListBox1 do
    Memo1.Lines.LoadFromFile(Items[ItemIndex]);
end;
Avatar billede borrisholt Novice
28. december 2000 - 11:17 #2
azs > Det svar nico22 har giver virker basalt set. problemer er blot at det blokerer hele dit program mens den kører.

På http://borrisholt.com kan du finde et eksempel på en anden måde, og efter min bog bedere, idet den er lavet i en tråd og der med en klase som kaster et event af sig nå den har fundet en fil eller mappe.

endvidere kunne det jo være du getne ville have iconer etc med fra de filer du finder .. Alt samen illusteret i et og samme eksempel : Du finder der under fanen File IO og eksempler hedder ThreadSearch.

Jens B
Avatar billede picard Nybegynder
28. december 2000 - 12:29 #3
Borrisholt >> Nico22s eksempel er ganske udemærket til det formål som spørgeren har beskrevet. Ideen med at bruge en tråd, i dette eksempel er sq en smule overkill !

Christian
Avatar billede nico26 Nybegynder
28. december 2000 - 16:26 #4
Rettelse.
Hvis der flere lag af undermapper skal metoden kalde sig selv rekursivt for hver mappe den finder med den nye sti

procedure TForm1.Search(Path, Ext: string);
var
  SR: TSearchRec;
  i: Integer;
  Strings: TStringList;
begin
  Path := Path + \'\\\';
  if FindFirst(Path + \'*.*\', faDirectory, SR) = 0 then
    try
      repeat
        if ((SR.Attr and faDirectory) <> 0) and (SR.Name[1] <> \'.\') then
        begin
          Strings := FindTxt(Path + SR.Name + \'\\\', Ext);
          try
            i := 0;
            while i < Strings.Count do
            begin
              ListBox1.Items.Add(Strings[i]);
              Inc(i);
            end;
          finally
            Strings.Free;
          end;
          Search(Path + SR.Name, Ext); //søger i den fundne mappe efter undermapper
        end;
      until (FindNext(SR) <> 0);
    finally
      SysUtils.FindClose(SR);
    end;
end;
Avatar billede borrisholt Novice
28. december 2000 - 19:32 #5
picard  >> Klasser klasser og atter klasser ! Det er hoved princippet bag moderne programmering. sproget \"indeni\" Delphi hedder som bekendt (?) Object Pascal, og udemærker sig ved at være object orienteret ....

Der for er det, igen efter men bog, en bedere løsning at bruge et søge object ....
Der udover kan man lave sin programering event drevet istedet for at styre sit program flow vha procedures ....

Men igen det er helt op til spørgeren ....

Jens B
Avatar billede nico26 Nybegynder
28. december 2000 - 20:01 #6
borrisholdt>> jeg er helt enig med dig, men jeg tænkte at det vigtigste var at give spøgeren er forholdsvist kort eksempel på hvordan det kan gøres, og så må det være op til ham selv at strukturere sit program som han selv mener det skal være.
I øvrigt ligger metoderne også i en klasse. Den hedder TForm1, så det er vel forkert at sige at det ikke er objektorienteret. *<||:-)
Avatar billede azs Nybegynder
29. december 2000 - 18:00 #7
borrisholt -> Hvis jeg skulle en slaks søgemaskine så ville jeg bruge din ThreadSearch. Men det skal jeg ikke.

Jeg skal kun bruge det i starten, når mit program loader!

Så nico22\'s er godt nok til det!
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