Avatar billede dl Nybegynder
24. juni 2004 - 21:39 Der er 18 kommentarer og
1 løsning

Liste over Mange filer

Jeg skal lave en liste over et stor antal filer på harddisk.

Hvordan laver det, så jeg ikke løber tør for ram, osv ??

//dl
Avatar billede bufferzone Praktikant
24. juni 2004 - 21:41 #1
ved ikke hvordan det gøres med Delphi, men du kan i dos lave en dir >liste.txt så får du en tekstfil med en liste over filer over det bibliotek du står i
Avatar billede dl Nybegynder
24. juni 2004 - 21:43 #2
Det var ikke lige det, jeg have tænkt. :)

//dl
Avatar billede arne_v Ekspert
24. juni 2004 - 21:44 #3
Du skal bruge en dynamisk data struktur til at gemme navnene i. Hvis du selv vil
lave den så lav f.eks. en dobbelt linket liste. Men sandsyneligvis har Delphi
noget færdigt til det. 100000 filer af 50 tegn er kun 5 MB og det er jo ikke
meget på dagens computere. Så finder du alle filer i et directpry, tilføjer dem til
listen og kalder rekursivt på ale directories.
Avatar billede dl Nybegynder
24. juni 2004 - 21:47 #4
rekursivt?? der må du lige snakke dansk.

Jeg ved ikke hvor mange filer, der skal findes på HD'en.
Avatar billede arne_v Ekspert
24. juni 2004 - 21:49 #5
rekursivt = procedure som kalder sig selv

en dynamisk data struktur betydre netop at den udvides når man tilføjer d.v.s.
at man skal ikek kende størrelsen
Avatar billede dl Nybegynder
24. juni 2004 - 21:52 #6
okay ... så har du sat mig af.

Jeg køre en procedure. Som søge i en mappe... alle filer lægges ind i en liste.
Så Kalder jeg proceduren igen... til sidste så har jeg jo et par 100 lister =?

eller har jeg overset noget ?

//dl
Avatar billede arne_v Ekspert
24. juni 2004 - 22:00 #7
Alle filerne ligges ind i den samme liste.
Avatar billede dl Nybegynder
24. juni 2004 - 22:01 #8
Og hvis jeg har over 100000 filer, hvilken jeg nok ment kan komme over. hva så ?
Avatar billede arne_v Ekspert
24. juni 2004 - 22:05 #9
Hvis vi siger 50 tegn per fil, så er matematikken jo nem:

100000 filer => 5 MB
1 million filer => 50 MB

Så kan du jo vurdere hvormange filer du har RAM til at kunen klare.

Hvis du forventer over en million filer så skal du nok til at overveje
en database løsning.

Men det giver lidt ekstra kompleksitet.
Avatar billede dl Nybegynder
24. juni 2004 - 22:07 #10
k, der fik du mig.

Hvad kan så klare dine 100000 filer ?

en listbox eller hva

???
Avatar billede arne_v Ekspert
24. juni 2004 - 22:15 #11
Ikke en GUI komponent. Enten en hjemmelavet dobbelt linket liste. Eller
en Delphi collection type.
Avatar billede arne_v Ekspert
24. juni 2004 - 22:16 #12
Jeg checkede iøvrigt lige. Jeg har installeret en 50-100 forskellige
software på min PC. Og jeg har 300000 filer.
Avatar billede dl Nybegynder
24. juni 2004 - 22:16 #13
okay, fik jeg ikke skrivet: JEG er en amatør til delphi.

Så noget hjælp her, ville hjælp. ;)
//dl
Avatar billede arne_v Ekspert
24. juni 2004 - 22:22 #14
Jeg kan godt prøve at skrive noget kode.

Jeg tror bare at mere Delphi kyndige end mig kunne skrive det smartere end
jeg kan.
Avatar billede arne_v Ekspert
24. juni 2004 - 23:05 #15
Eksempel som illusterer teknikken:

program dirlist;

{$APPTYPE CONSOLE}

uses
  SysUtils;

type
  ptronefile = ^onefile;
  onefile = record
              next : ptronefile;
              prev : ptronefile;
              name : string;
            end;

procedure addfile(name : string; var first,last : ptronefile);

var
  tmp : ptronefile;

begin
  if first = nil then begin
    new(first);
    tmp := nil;
    last := first;
  end else begin
    new(last^.next);
    tmp := last;
    last := last^.next;
  end;
  last^.next := nil;
  last^.prev := tmp;
  last^.name := name;
end;

procedure printfiles(first : ptronefile);

var
  curr : ptronefile;

begin
  curr := first;
  while curr <> nil do begin
      writeln(curr^.name);
      curr := curr^.next;
  end;
end;

procedure dirlistrec(dirspec : string; var first,last : ptronefile);

var
  sr : TSearchRec;

begin
  if FindFirst(dirspec + '*.*', faAnyFile, sr) = 0 then begin
    if (sr.Attr and faDirectory) <> 0 then begin
      if (sr.Name <> '.') and (sr.Name <> '..') then begin
        dirlistrec(dirspec + sr.Name + '\', first, last);
      end;
    end else begin
      addfile(dirspec + sr.Name, first, last);
    end;
    while FindNext(sr) = 0 do begin
      if (sr.Attr and faDirectory) <> 0 then begin
        if (sr.Name <> '.') and (sr.Name <> '..') then begin
          dirlistrec(dirspec + sr.Name + '\', first, last);
        end;
      end else begin
        addfile(dirspec + sr.Name, first, last);
      end;
    end;
    FindClose(sr);
  end;
end;

var
  first,last : ptronefile;

begin
  first := nil;
  last := nil;
  dirlistrec('C:\zzz\', first, last);
  printfiles(first);
end.
Avatar billede arne_v Ekspert
24. juni 2004 - 23:05 #16
Det er en console app, men du kan bare erstatte printfiles med hvad du nu
vil gøre ved filnavnene.
Avatar billede arne_v Ekspert
24. juni 2004 - 23:07 #17
Og hvis du kan bruge det, så synes jeg ikke at det var et nemt (15p) spørgsmål.

:-)
Avatar billede arne_v Ekspert
24. juni 2004 - 23:08 #18
Men det hjælper selvfølgelig ikke at det er 14-15 år siden jeg sidst har leget
med linkede lister i Pascal.
Avatar billede coladrenge Nybegynder
29. juni 2004 - 21:47 #19
Alternativt kunne man bruge en memtable -eks. KbmMemTable
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