---
title: "Fillistning"
type: "forum-thread"
url: "https://www.webforum.nu/amne/programmering/27855-fillistning"
topic: "Programmering"
topic_url: "https://www.webforum.nu/amne/programmering"
author: "svampträsk"
published: "2000-12-02T18:04:00.000Z"
updated: "2000-12-15T23:15:00.000Z"
replies: 8
views: 445
page: 1
pages: 1
language: "sv-SE"
site: "webForum — webforum.nu"
rights: "Upphovsrätten till varje inlägg tillhör dess författare."
attribution: "Citera som: webForum, https://www.webforum.nu/amne/programmering/27855-fillistning"
---

# Fillistning

## #1 — svampträsk, 2000-12-02T18:04Z

hur tar man reda på vad det finns för filer (och kataloger) i en katalog?

Permalänk: https://www.webforum.nu/p/27855

## #2 — WiNNe, 2000-12-04T08:15Z

Med funktionerna FindFirst och FindNext. Nedanstående exempel är från delphi hjälpen.
\--------------------------------------------------------

This example uses a label, a button named Search, and a button named Again on a form. When the user clicks the Search button, the first file in the specified path is found, and the name and the number of bytes in the file appear in the label's caption. Each time the user clicks the Again button, the next matching file name and size is displayed in the label:

var

  SearchRec: TSearchRec;
procedure TForm1.SearchClick(Sender: TObject);
begin
  FindFirst('c:\\Program Files\\delphi4\\bin\\\*.\*', faAnyFile, SearchRec);
  Label1.Caption := SearchRec.Name + ' is ' + IntToStr(SearchRec.Size) + ' bytes in size';
end;
procedure TForm1.AgainClick(Sender: TObject);
begin
  if (FindNext(SearchRec) = 0)
        Label1.Caption := SearchRec.Name + ' is ' + IntToStr(SearchRec.Size) + ' bytes in size';

  else
    FindClose(SearchRec);
end;

Permalänk: https://www.webforum.nu/p/400507

## #3 — svampträsk, 2000-12-07T21:02Z

Funkar kanonbra, tackar! 

Hur bestämmer man bäst om det är en katalog eller en fil? (att köra DirectoryExists på varje fil/katalog verkar långsökt...)

Permalänk: https://www.webforum.nu/p/400508

## #4 — jt, 2000-12-08T07:57Z

if (SearchRec.Attr and faDirectory) = faDirectory) then
 //Detta ska vara en katalog

Permalänk: https://www.webforum.nu/p/400509

## #5 — svampträsk, 2000-12-08T17:46Z

Tackar!

snitsiga julikoner föresten... :e

Permalänk: https://www.webforum.nu/p/400510

## #6 — svampträsk, 2000-12-12T17:54Z

2 frågor till...

1: Jag förstod inte riktigt logiken i "(SearchRec.Attr and faDirectory) = faDirectory".
   Det funkade perfekt, men varför blir det SearchRec.Attr AND faDirectory?
   Hur bör det bli om man bara fill ha filerna, och inte katalogerna?

2: Finns det något enkelt sätt att få FindFirst & FindNext att sortera annorlunda (t.ex. efter filändelse)

Permalänk: https://www.webforum.nu/p/400511

## #7 — jt, 2000-12-14T08:45Z

1\.
En katalog kan ju även ha attributet faReadOnly förutom fadirectory. Därför används (attr and faDirectory).

Testa följande så kanske du förstår bättre:
attr := faDirectory + faReadOnly;
x := (attr and faDirectory);
ShowMessage('attr = ' + IntToStr(attr) + ' x = ' + IntToStr(x) + ' faDirectory = ' + IntToStr(faDirectory));

2\.
Följande kod kräver delphi 5 tror inte TStringlist.CustomSort finns i tidigare versioner. 

//Startar filsökningen
procedure TForm1.Button1Click(Sender: TObject);
var
  FileList: TStringList;
begin
  FileList := TStringList.Create;

  //Returnerar filerna till Filelist
  GetFiles('c:\\\*.\*', faAnyFile, Filelist);

  //Sorterar Filelist
  FileList.CustomSort(FileExtSort);

  //Visar Filelist i Listbox1
  ListBox1.Clear;
  ListBox1.Items := FileList;

  FileList.Free;
end;

//Utför själva filsökningen
procedure GetFiles(Path: string; Attr: Integer; var FList: TStringList);
var
  SearchRec: TSearchRec;
  R: Integer;
begin
  FList.Clear;
  R := FindFirst(Path, Attr, SearchRec);
  while R = 0 do
  begin
    if (SearchRec.Name \<\> '.') and (SearchRec.Name \<\> '..') then
      FList.Add(SearchRec.Name);
    R := FindNext(SearchRec);
  end;
  FindClose(SearchRec);
end;

//Sorterar en TStringlist
function FileExtSort(StrList: TStringList; Item1, Item2: integer): integer;
begin
  Result := CompareText(ExtractFileExt(StrList\[Item1\]), ExtractFileExt(StrList\[Item2\]));
end;

Permalänk: https://www.webforum.nu/p/400512

## #8 — svampträsk, 2000-12-15T18:10Z

hmmm...

Jag fattar inte hur and tillsammans med integer funkar.
En titt på "logical (bitwise) operators" i hjälpen, hjälpte inte särskilt mycket.
i ditt exempel:
17 AND 16 = 16
hur går det ihop?

om jag t.ex. bara vill ha kataloger, hur anropar jag FindFirst då? (jag tänkte faDirectory - faAnyFile, men det gjorde ingen skilnad)

varför ger FindFirst(dir + '\*', faReadOnly + faArchive, SearchRec) samma som FindFirst(dir + '\*', 0, SearchRec)?

tack för hjälpen!

Permalänk: https://www.webforum.nu/p/400513

## #9 — jt, 2000-12-15T23:15Z

Använder man and på enskilda bitvärden så gäller följande tabell
0 and 0 = 0
0 and 1 = 0
1 and 0 = 0
1 and 1 = 1

Bitmöntren för konstanterna ser ut så här som du ser har varje konstant en bit som är på(1) utom faAnyfile. 
faReadOnly	0000000000000001
faHidden	0000000000000010
faSysFile	0000000000000100
faVolumeID	0000000000001000
faDirectory	0000000000010000
faArchive	0000000000100000
\=
faAnyFile	0000000000111111

I exemplet så gjordes följande om du kollar i tabellen överst så kanske det klarnar.
Attr := faReadOnly + faDirectory;
x := (Attr and faDirectory);
Attr får bitmönster	0000000000010001
x får bitmönster	0000000000010000

Håller med om att findfirst och findnext är lite skum.
I hjälpfilen står det:
"The Attr parameter specifies the special files to include in addition to all normal files"
Altså får du alltid med alla "normala filer" men du kan lägga till kataloger och andra onormala filer.

Om du bara ska ha kataloger så måste du alltid använda (SearchRec.Attr and faDirectory) = faDirectory).

Permalänk: https://www.webforum.nu/p/400514

---

Tråden på webben: https://www.webforum.nu/amne/programmering/27855-fillistning
