# Ordnerliste erstellen



## Nebuchadnezar (19. August 2003)

falls jemand schon sowas gefragt hat sry habs über suchen ned gfunden ...

also ich habe folgendes Problem:

Ich möchte jetzt zb vom Laufwerk c: eine liste von ordnern erstellen ohne Dateien - sollen aber alle Ordner sein(auch versteckte). Ich möchte das ganze irgendwie mit findfirst und findnext lösen ..hier ein Beispielcode:

#include <stdio.h>
#include <conio.h>
#include <dir.h>
#include <dos.h>
#include <dirent.h>
#include <iostream.h>

void main() {

     DIR *dir;
     struct ffblk ffblk;
     int x;
     chdir("c:\\");
     x = findfirst("*.",&ffblk,FA_DIREC);
     while(!x) {
        cout << ffblk.ff_name <<endl;
        x = findnext(&ffblk);
        }
        getch();
}

ich glaub das mit FA_DIREC passt so ich hab nur das problem mit den Suchkriterien(erster Parameter von findfirst() wenn ich zb *.* angeb bekomm ich trotz des Attributs FA_DIREC auch alle dateien. Wenn ich als ersten parameter "*."verwende bekomm ich zwar nur die Ordner aber ein Ordner wird nicht aufgelistet(aufgrund der Tatsache dass der Ordner eine Dateiendung hat *lol* - heisst  msdownld.tmp) den bekomm ich nicht angezeigt. Gibt es eine möglichkeit die Kriterien für Ordner zu ignorieren?

Hinweis für die Attribute:

FA_RDONLY	Schreibgeschützte Datei
FA_HIDDEN	Verborgene Datei
FA_SYSTEM	Systemdatei
FA_LABEL	                     Datenträgername
FA_DIREC	                    Verzeichnis
FA_ARCH	                    Archiv-Bit


----------



## Nebuchadnezar (27. August 2003)

puh massenhaft antworten  hab ich mich schlecht ausgedrückt oder was
bitte um antwort


----------



## Kachelator (27. August 2003)

Du hast Dich nicht schlecht ausgedrückt. Mein Problem war, dass Du mit findfirst usw. arbeiten willst. Da kann ich Dir nicht weiterhelfen. Lösungen, die ohne das auskommen, könnte ich *vielleicht* anbieten (muss ich nochmal im Nähkästchen nachschauen). Interesse?


----------



## Nebuchadnezar (28. August 2003)

bitte schossen sie lies  
es war eigentlich deswegen weil readdir glaub i ned mit jedem compiler geht ..kann sein dass es nur mitm bcb geht oder is readdir standardmäßig bei c++ dabei..wenn ja dann steh ich damit an dass ich nicht weis wie ich suchkriterien angebe
..wie auch immer schau mal im "Nähkästchen" nach


----------



## Nebuchadnezar (30. August 2003)

he kachelator bitte melde dich ich komm einfach nicht dahinter welche möglichkeiten ich noch habe


----------



## Kachelator (30. August 2003)

Bin noch nicht dazu gekommen, versuche es morgen. Sorry.


----------



## Kachelator (31. August 2003)

So, ich bin in einem ziemlich alten Projekt fündig geworden und tu Dir mal den Schnipsel:


```
HANDLE              hFind;
  WIN32_FIND_DATA     wData;
  char                zPath[MAX_PATH];

  hFind = FindFirstFile( zPath, &wData );
  do
  {
    if ( hFind != INVALID_HANDLE_VALUE )
    {
      if ( wData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY )
      {
        //- Hurra, ein Directory!

        //- was tun damit, eventuell rekursiv weitersuchen
      }
    }
  }
  while ( hFind != INVALID_HANDLE_VALUE );
  FindClose( hFind );
```

Hilft Dir das weiter?


----------



## Nebuchadnezar (31. August 2003)

ich probiers mal aus
___________
kenn mich mit handle und dem quargel ned so aus ..was mach ich damit?
__________
FindFirstFile ist nicht dokumentiert ... bin im moment überfragt


----------



## Kachelator (31. August 2003)

Was verwendest Du eigentlich für eine Entwicklungsumgebung? FindFirstFile usw. sind aus der WIndows-API.


----------



## Nebuchadnezar (31. August 2003)

daweil bcb nur da ich nicht so viel zeit zum proggen hab und das anfangs von der schule gelernt habe wirst du dir denken können dass ich mit begriffen wie windows-api nicht so viel anfang mfc kann ich grad noch visual studio zuordnen aber das wars auch scho mit meinen kenntnisssen :-(


----------



## Kachelator (31. August 2003)

Hmm. Ohne die API wird es vermutlich nicht gehen. Wegen Dokumentation könntest Du mal ins  MSDN reinschauen (unübersichtlich!): http://www.msdn.microsoft.com. Da findet Du die API erklärt. 'bcb' ist vermutlich der Borland-C-Builder, oder? Borland hat auch eine Online-Doku:


----------



## Nebuchadnezar (31. August 2003)

hab grad ein ziemlich gutes winapi tutorial gefunden ich steh nur vor dem problem dass noch einen linker fehler bei folgendem programm hab


#include <windows.h>
#define STRICT
const char szWitz[] = "\"Ich steh schwer auf Umweltschutz\", sagt Peter.\n"
                      "\"Ich werfe zum Beispiel alte U-Bahn-Fahrscheine nie weg,\n"
                      "sondern benutze sie mehrmals.\"";
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                    PSTR szCmdLine, int iCmdShow)
{

     int iAntwort = MessageBox(NULL, szWitz, "Ha, ha, ha, ha...",
     MB_ICONINFORMATION | MB_OKCANCEL | MB_DEFBUTTON1);

     if(IDOK == iAntwort)
     {
          MessageBox(NULL, "Ja, ich finde den Witz auch Ok...",
                       "Sie haben auf Ok gedrückt",
                       MB_ICONINFORMATION | MB_OK | MB_DEFBUTTON1);

     }
     else if(IDCANCEL == iAntwort)
     {
          MessageBox(NULL, "Ja, warum haben sie denn auf Abbrechen gedrückt?\n"
                           "Hat ihnen der Witz etwa nicht gefallen?",
                           "Sie haben auf Abbrechen gedrückt",
                           MB_ICONINFORMATION | MB_OK | MB_DEFBUTTON1);
     }

     return 0;
}


______________________________________


[Linker Fehler] Unresolved external '_main' referenced from D:\PROGRAMME\CBUILDER5\CBUILDER5\LIB\C0X32.OBJ

das is die fehlermeldung...im tut steht ich muss irgendein compiler flag setzen 
-tW is das flag ...aber keine ahnung wo ..nachher gehts wahrscheinlich


----------



## Kachelator (31. August 2003)

Dazu kann ich Dir nichts sagen, das ist Builder-spezifisch. Solltest Du auch in einen neuen, entsprechend benamsten Thread reintun, die Frage.

PS: Code pack besser zwischen Code-Tags: 
EckigeKlammerAuf + 'code' + EckigeKlammerZu
_dein Code_ 
EckigeKlammerAuf + '/code' + EckigeKlammerZu


----------



## Nebuchadnezar (31. August 2003)

1.) ok mach ich
2.) aha mindestens... oder anders aus gedrückt ..
what the **** are you talking about ...sry überhaupt keinen dunst was du meinst :-(
_____________________
das mitm linkerfehler hat sich erledigt ..hab übersehn ..wenn ich die c++ datei erstell muss ich noch den button für konsolenanwendung erstellen wegklicken


----------



## Kachelator (31. August 2003)

> what the **** are you talking about ...sry überhaupt keinen dunst was du meinst


 Komisch, geht mir gerade auch so.  Meinst Du meinen Hinweis mit dem Code-Tag? Das war wg. Verlust der Formatierung beim Einfügen Deiner Programmschnipsel, die den Code quasi unlesbar gemacht haben.


> das mitm linkerfehler hat sich erledigt ..hab übersehn ..wenn ich die c++ datei erstell muss ich noch den button für konsolenanwendung erstellen wegklicken


 Dann ist ja alles gut.


----------



## Nebuchadnezar (1. September 2003)

vergiss es..hat sich erübrigt ...bzw..schau oben zum sourcecode denn ich gepostet hab ...bin eh scho draufkommen wie man beim bcb das kompilliert...
aber .....
aso das meinst ...dann is ja das geklärt ..
kann man eigentlich irgendwo links zu seiten posten die man gern weitergeben möchte?
winapitutorial


----------



## Kachelator (2. September 2003)

> kann man eigentlich irgendwo links zu seiten posten die man gern weitergeben möchte?


 Da ist beim Beantwortenformular so ein Knopf (Button) mit der Aufschrift "http://", aber einfach die URL pasten (meine: einfügen) scheint auch zu gehen.


----------



## Nebuchadnezar (2. September 2003)

hab ich eh scho gmacht wenn du genau schaust  
i hab gmeint außerhalb dieses posts damit ma ihn auch wiederfindet?


----------



## Kachelator (2. September 2003)

Verstehe die Frage wohl nicht.


----------



## Nebuchadnezar (3. September 2003)

> vergiss es


nicht so wichtig
_________-
closed


----------



## Nebuchadnezar (7. September 2003)

deinen Quellcode hab ich jetzt endlich verstanden ..du hast recht ghabt ich brauch die winapi weil ordner mit dateiendungen...ich weis das is komisch ..wie auch immer kann man nur mit findfirstfile anzeigen ...bei findfirst und findnext war das nicht implementiert


----------



## Nebuchadnezar (7. September 2003)

jaja ich weis ich lass ned so schnell locker aber
ich hab das nochmal betrachtet und soweit wie es mir möglichwar vervollständigt aber ich find nicht die nötigen attribute um alle ordner anzuzeigen bei genauerer betrachtung der fertigen lösung bin ich draufgekommen dass das programm bei den verstecken ordnern und dem ordner mit dateiendung glaubt dass dies dateien sind ;(
wenn ich NUR FILE_ATTRIBUTE_NORMAL angeb zum ausgeben bekomm ich komischerweise 0 ordner oder dateien und da müsste eigentlich alles angezeigt werden oder etwa nicht?


----------



## Kachelator (7. September 2003)

Könnte es daran liegen, dass du die Attribute direkt vergleichst, anstatt das gewünschte Bit freizufiltern?
Z.B.
	
	
	



```
if ( wData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY )
{
  // richtig
}
```
anstelle von.
	
	
	



```
if ( wData.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY )
{
  // suboptimal :)
}
```
Beachte *&* und *==*.
Es können ja mehrere Attribute miteinander verodert sein. Vielleicht verstehe ich aber auch dein Problem falsch.


----------



## Nebuchadnezar (8. September 2003)

wenn das dasselbe wie 
	
	
	



```
FData.dwFileAttributes &= FILE_ATTRIBUTE_DIRECTORY
```
  das ist dann ja

jetzt gehts auf einmal
nur auf die art funktioniert noch immer nicht file_attribute_normal
abgesehn davon wenn ich es so getestet hätte wäre es mit findfirst auch gegangen
------
ist die win32 sdk schlecht erklärt oder heisst FILE_ATTRIBUTE_ARCHIVE einfach dass es ne ganz normale datei ist?


----------



## Kachelator (8. September 2003)

> ist die win32 sdk schlecht erklärt oder heisst FILE_ATTRIBUTE_ARCHIVE einfach dass es ne ganz normale datei ist?


Weder noch. Aus MSDN:





> FILE_ATTRIBUTE_NORMAL   The file has no other attributes set. This attribute is valid only if used alone. All other file attributes override this attribute.


 Daraus schliesse ich, das es möglich ist,  dass dieses Flag zusammen mit anderen gesetzt sein kann. Es ist dann jedoch bedeutungslos. Ob das sinnvoll ist, kann ich nicht sagen.


----------



## Nebuchadnezar (8. September 2003)

anhand der win32 sdk sehe ich dass FILE_ATTRIBUTE_NORMAL nur funktioniert wenn es allein gesetzt wird ...warum auch immer jedenfalls ...jetzt weis ich endlich was ich immer falsch gemacht habe


----------

