Dateien in ListBox auflisten


Supa

Erfahrenes Mitglied
#2
Moin,

also ich würd zunächst mal alle Dateinamen in dem Verzeichnis einlesen (meinetwegen in ner Liste zwischenspeichern, wenn du sie nachher noch brauchst) und dann schön der Reihe nach in die ListBox einfügen.

mfg
 

Supa

Erfahrenes Mitglied
#4
Ja, dann sag doch das du wissen möchtest, wie man Dateien einliest ;)

Also ich hab mal ne Funktion geschrieben, mit der man Verzeichnisse einlesen kann. Das ging ungefähr so:
Code:
String root = "c:";
WIN32_FIND_DATA flData;

HANDLE hFind = FindFirstFile((root+"\\"+"*").c_str(), &flData);
BOOL bOK = hFind != INVALID_HANDLE_VALUE;

while (bOK){
  if(flData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY){
    if(flData.cFileName[0] != '.'){
      ListBox1->AddItem(flData.cFileName, 0);
    }
  }
  bOK = FindNextFile(hFind, &flData);
}
Wenn du das FILE_ATTRIBUTE_DIRECTORY änderst (dazu Google:"WIN32_FIND_DATA") müsste es eigentlich möglich sein, nur Dateien aus zu lesen.

mfg
 
#5
Von http://www.swissdelphicenter.ch/de/showcode.php?id=1725:

Code:
procedure ListFileDir(Path: string; FileList: TStrings);
var
  SR: TSearchRec;
begin
  if FindFirst(Path + '*.*', faAnyFile, SR) = 0 then
  begin
    repeat
      if (SR.Attr <> faDirectory) then
      begin
        FileList.Add(SR.Name);
      end;
    until FindNext(SR) <> 0;
    FindClose(SR);
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  ListFileDir('C:\WINDOWS\', ListBox1.Items);
end;
Der CBuilder und Delphi basieren beide auf der VCL, von daher ist der Code problemlos nach C++ VCL portierbar, da alle Objekte (z.B. TSearchRec) auch in C++ verwendbar sind.

Das Ergebnis sieht dann so aus:
C++:
void __fastcall TForm1::ListFileDir(String Path, TStrings* FileList)
{
	TSearchRec SR;

	if (FindFirst(Path + "*.*", faAnyFile, SR) == 0)
	{
		do
		{
			if(SR.Attr != faDirectory)
			{
				FileList->Add(SR.Name);
                        }
		}
		while(FindNext(SR) == 0);
	}
}

void __fastcall TForm1::Button1Click(TObject *Sender)
{
	ListFileDir("C:\\WINDOWS\\", ListBox1->Items);	
}
Zu Delphi gibt es eine Vielzahl von Tips, Tricks und Tutorials, die sich in fast allen Fällen auch auf C++ VCL übertragen lassen, von daher kann ich dir das SwissDelphiCenter sehr ans Herz legen. ;)
 

Supa

Erfahrenes Mitglied
#7
ListFileDir ist eine Funktion, die Du dir selbst schreibst. ^^

Das hier ist quasi deren Inhalt
Code:
String Path = "c:\\windows"; 
TStrings* FileList = new FileList();

TSearchRec SR;
 
    if (FindFirst(Path + "*.*", faAnyFile, SR) == 0)
    {
        do
        {
            if(SR.Attr != faDirectory)
            {
                FileList->Add(SR.Name);
                        }
        }
        while(FindNext(SR) == 0);
    }
Die FileList kannst du nachher einfach in die ListBox adden, wenn mich nicht alles täuscht. Theoretisch brauchst du dafür auch keine Funktion zu schreiben. Aber das würde sich natürlich anbieten, wenn du die Funktion öfter benutzen willst.

mfg
 
#8
@Supa:
Hrgn... da zuckt gleich mein Augenlid, wenn ich ein new ohne entsprechendes delete sehe...

@-H-T-P-:
Supa hat recht. In deinen Header mußt du natürlich noch die entsprechenden Funktionsprototypen mit aufnehmen.
 
#9
Ich weiß, stell mich ziemlich blöd ;).
Trotzdem, wenn ich den Code oben (von Supa) unverändert einfüge kommt bei mir folgendes:

Bei: TStrings* FileList = new FileList();
Error: [C++ Error] Unit1.cpp(14): E2303 Type name expected
[C++ Error] Unit1.cpp(14): E2034 Cannot convert 'int *' to 'TStrings *'
[C++ Error] Unit1.cpp(14): E2141 Declaration syntax error


Bei: if (FindFirst(Path + "*.*", faAnyFile, SR) == 0)
Error: [C++ Error] Unit1.cpp(18): E2040 Declaration terminated incorrectly
 

Supa

Erfahrenes Mitglied
#10
Also erstmal hab ich bestimmt schon 2 Jahre nicht mehr mit dem BCB programmiert. Und mittlerweile auch nicht mehr in C/C++. Darum vergebt mir meine grobe Fahrlässigkeit ;)

Und Sorry, TStrings * FileList mit new FileList() :D zu initialisieren is natürlich auch totaler Bullshit. FileList ist natürlich nur der Variablenname. Da waren die Finger wieder schneller als der Kopf -.-

Okay, hier noch mal eine komplette Funktion, die euer beider Zufriedenheit sicherstellen sollte:
Code:
String Path = "c:\\windows\\";
TStringList* FileList = new TStringList();
TSearchRec SR;

    if (FindFirst(Path + "*.*", faAnyFile, SR) == 0)
    {
        do
        {
            if(SR.Attr != faDirectory)
            {
                FileList->Add(SR.Name);
            }
        }
        while(FindNext(SR) == 0);
    }
    ListBox1->Items->AddStrings(FileList);
    delete FileList;
Implementiert und getestet.

mfg