# Verzeichnis auflisten



## baigox (28. Mai 2010)

Also
Ich habe einen Ordner, sagen wir "C:\New_Folder".
nun will ich wissen mit welchen Befehlen ich die Dateien auflisten kann, die in diesem Ordner sind.
Am besten es wird in eine Date geschrieben und vornedrann muss noch die anzahl der dateien stehen!.

ich stell mir dass so vor z.B.:
in dem Orner sind text1.txt, text2.txt, unnamedtext.txt, Baigox.txt und testtext.txt

jetzt will ich dass in der Datei(dessen name und verzeichnes ich kenne) es so aussieht:

```
5
text1.txt
text2.txt
unnamedtext.txt
Baigox.txt
testtext.txt
```
(Hoffentlich verständlich geschrieben)


----------



## ComFreek (28. Mai 2010)

Fall es unter Windows sein soll:

```
#include <iostream>
#include <dirent.h>
DIR *hdir;
struct dirent *entry;

hdir = opendir(".");
do
{
    entry = readdir(hdir);
    if (entry)
    {
        cout << entry->d_name << endl;
    }
} while (entry);
closedir(hdir);
```
(Habe einfach mal Copy&Paste gemacht, also musst du es noch etwas abwandeln)
Am besten nimmst du als Container für die Dateien Vektoren.


----------



## Matthias Reitinger (28. Mai 2010)

baigox hat gesagt.:


> Also
> Ich habe einen Ordner, sagen wir "C:\New_Folder".
> nun will ich wissen mit welchen Befehlen ich die Dateien auflisten kann, die in diesem Ordner sind.


FindFirstFile, FindNextFile und FindClose. In der MSDN-Bibliothek gibt es auch noch explizit ein Beispiel zum Auflisten von Dateien.

Grüße,
Matthias


----------



## baigox (28. Mai 2010)

@ComFreek
Nicht schlecht
aber was muss ich machen um in einem Unterordner zu suchen?


----------



## baigox (29. Mai 2010)

diese Frage war an alle gestellt!
hier der Code wie ich ihn ungebaut habe:

```
#include <dirent.h>
#include<windows.h>
#include<fstream>
#include<stdio.h>
#include<iostream>
#include<iomanip>
using namespace std;
int zahler;
DIR *hdir;
struct dirent *entry;
int main(){
DeleteFile(",Liste.txt");
fstream f;
hdir = opendir(".");
do
{
    entry = readdir(hdir);
    if (entry)
    {
        cout << entry->d_name << endl;
        f.open(",Liste.txt",ios::out|ios::app);
        f << entry->d_name << endl;
        f.close();
        zahler++;
    } 
} while (entry);
closedir(hdir);
cout << endl;
fstream g;
DeleteFile(",Anzahl.txt");
g.open(",Anzahl.txt",ios::out);
g << zahler;
system("pause");
}
```
ich hab das jetzt für dev-cpp umgeschrieben.
kann sein ,dass ich ein paar includes zuviel habe.
ich möchte jetzt wissen was ich machen muss um einen Unterordner zu durchsuchen?


----------



## Cromon (29. Mai 2010)

Über eine rekursive Funktion. Wenn du nur für Windows programmierst wäre es eigentlich sinnvoller die WinAPI zu verwenden, wie es dir Matthias vorgeschlagen hat.


----------



## baigox (29. Mai 2010)

WinAPI?
Ich hab mich jetzt an Dev-Cpp gewöhnt und werde auch nichts anderes nehmen!
also was soll ich ändern?


----------



## badday (29. Mai 2010)

Moin,

das kannst du mit boost sehr einfach erreichen:


```
printFiles(string ActualPath, ofstream &out, string path)
{
	boost::filesystem::directory_iterator end_itr;
	for ( boost::filesystem::directory_iterator itr(ActualPath);itr != end_itr;++itr )
	{
		if ( boost::filesystem::is_directory(itr->status()))
		{
			printFiles( itr->path().string(), out, path) ;
		}
		else
		{
				string filenameToPrint = itr->path().string();
				filenameToPrint.erase(0, path.size()); //damit die Pfade relativ sind, wenn du das willst
                out<<filenameToPrint<<"\n";
		}
	}

	}
```

Die Anzahl der Dateien kannst du einfach ermitteln, wenn du z. B. eine Zeile freilässt, dir von der Funktion oben eine Zahl zurückliefern lässt und diese in die Datei schreibst (in die oberste Zeile).


Gruß,

badday


----------



## Cromon (29. Mai 2010)

baigox hat gesagt.:


> WinAPI?
> Ich hab mich jetzt an Dev-Cpp gewöhnt und werde auch nichts anderes nehmen!



Die WinAPI ist das Windows Application Programming Interface. Also einfach alle Windowsspezifischen Funktionen, Klassen, Strukturen, usw. Das hat nichts mit dem IDE zu tun. Dev-C++ ist übrigens absolut nicht empfehlenswert. Der Compiler ist auf dem Stand von vor 5 Jahren.


----------



## badday (29. Mai 2010)

> Dev-C++ ist übrigens absolut nicht empfehlenswert. Der Compiler ist auf dem Stand von vor 5 Jahren.


Sehr richtig.

Wenn du dich im Übrigen fragt, wie du an den Anfang der Datei kommst (in die 1. Zeile):

```
file.seekg (0, std::ios::beg);
```

Gruß,

badday


----------



## Cromon (29. Mai 2010)

Und was du ändern sollst, baigox, siehst du auch in baddays Posting. Die Funktion wird rekursiv wieder aufgerufen, wenn ein Verzeichnis gefunden wurde, das ist eigentlich die Hauptüberlegung.


----------



## deepthroat (29. Mai 2010)

Hi.

Dieses Thema gibt es hier auch schon so häufig, das man sich wirklich fragen muss warum schon wieder... 

Z.B. http://www.tutorials.de/forum/c-c/3...ursiven-loeschen-von-ordnern-und-dateien.html

Gruß


----------



## badday (29. Mai 2010)

Code::Blocks ist kein Compiler! Und ja, es gibt Unterschiede. Und eine Software, die nicht weiterentwickelt wird, ist natürlich hinter anderen Compilern, sei es bei Bugs, aber auch bei Features, wie der Unterstützung des kommenden Standards etc., auch die Anpassung an neue Hardware ist ein Punkt.

Gruß,

badday


----------



## kickerxy123 (29. Mai 2010)

hm nagut  So gesehen kann man seinen Code aber auch "optimieren" nach dem Motto "wenns sogar unter Dev-cpp läuft...", da er ja tendenziell weniger unterstützt. 

[sry, hatte mein Post schon gelöscht, ist ja irgendwie auch logisch]


mfg kickerxy

#edit: Dass Code::Blocks eine IDE ist, ist mir auch bewusst. Das habe ich eben vielleicht verwechselt.


----------



## badday (29. Mai 2010)

@baigox: Konnte dir geholfen werden?

@kickerxy123: OK, sry, hatte noch nicht aktualisiert.

Gruß,

badday


----------



## baigox (31. Mai 2010)

so
ich hab das Problem anders gelöst.
aba ihr habt mir geholfen!


----------



## Cromon (31. Mai 2010)

Dann poste doch mal die Lösung, vielleicht findet sie jemand anderes auch gut. Oder vielleicht ist ein Fehler drin, den du nicht realisiert hast.


----------



## baigox (6. Juni 2010)

also
ich hab zwar keinen Unterordner dürchsucht aber:

erst erstellt das programm eine Datei, in der alles drinnsteht.
dann filter es die ersten 7 Einträge raus diese wären:

```
..
.
-start.cmd
-data.txt
-dateien.txt
-unbenannt1.exe
-locator.exe
```
das - ,weil es nur die ersten 7 Einträge löscht, das - rückt diese Dateien an die ersten Stellen.
-unbenannt1.exe weil mann noch ein belibiges programm hinzufügen kann, welches vielleicht den Inhalt des Ordners benötigt.


Dateierklärung:

-start.cmd
	
	
	



```
@echo off
START -locator.exe
Sart -unbenannt1.exe
```

-data.txt
	
	
	



```
Anzahl der Dateien im Ordner
```

-dateien.txt
	
	
	



```
Liste der Dateien im Ordner
```

-unbenannt1.exe
	
	
	



```
diese Datei kann belibig gefüllt werden
```

-locator.exe
	
	
	



```
#include <dirent.h>
#include<windows.h>
#include<fstream>
#include<stdio.h>
#include<iostream>
#include<iomanip>
using namespace std;
void filter(){
     int anzahl;
    fstream f;
    f.open("-data.txt",ios::in);
    f >> anzahl;
    f.close();
    char data[anzahl][50];
    fstream g;
    g.open("-dateien.txt");
    for(int b=0;b<anzahl;b++){
    g >> data [b];
    }
    g.close();
    DeleteFile("-dateien.txt");
    for(int a=0;a<=50;a++){
    for(int b=0;b<=5;b++){
    data[b][a]=(NULL);
}}
    for(int b=0;b<=anzahl;b++){
    printf("%s\n",data[b]);
    fstream a;
    a.open("-dateien.txt",ios::out|ios::app);
    a << data[b] << endl;
    a.close();
    
}
fstream c;
c.open("-data.txt",ios::out);
c << anzahl-7;
c.close();
printf("\n");
     };
int zahler;
DIR *hdir;
struct dirent *entry;
int main(){
DeleteFile("-dateien.txt");
fstream f;
hdir = opendir(".");
do
{
    entry = readdir(hdir);
    if (entry)
    {
        cout << entry->d_name << endl;
        f.open("-dateien.txt",ios::out|ios::app);
        f << entry->d_name << endl;
        f.close();
        zahler++;
    } 
} while (entry);
closedir(hdir);
cout << endl;
fstream g;
DeleteFile("-data.txt");
g.open("-data.txt",ios::out);
g << zahler;
g.close();
filter();
}
```

ACHTUNG!:ALLE DATEIEN DIE MIT "-" ANFANGEN KÖNNTEN DAS PROGRAMM STÖREN!
(wie macht man diesen c++ code im forum?)
Verbesserungen erwünscht.


----------



## ComFreek (6. Juni 2010)

baigox hat gesagt.:


> (wie macht man diesen c++ code im forum?)


Du musst folgendes schreiben:
*[ cpp ]a[ /cpp ] (Natürlich ohne die Leerzeichen)*


----------



## deepthroat (7. Juni 2010)

Hi.

@baigox: Du schreibst zeilenweise Strings in die Datei (die eine unterschiedliche Länge haben) und liest Blöcke von 50 Bytes aus. Das passt irgendwie nicht zusammen.

Außerdem ist es unsinnig die Datei ständig zu öffnen und zu schließen, die DeleteFile Aufrufe kannst du dir auch sparen. Weiterhin überprüfst du nicht ob die Datei(en) überhaupt geöffnet werden konnten.

Warum schreibst du denn überhaupt die ersten 7 Einträge in die Datei rein, nur um sie dann nachher wieder zu entfernen? Es ist übrigens nirgendwo festgelegt in welcher Reihenfolge die Einträge von der opendir Funktion geliefert werden, die ersten Einträge müssen also nicht immer die sein welche du filtern möchtest.

Und du solltest deinen Code ordentlich einrücken und globale Variablen vermeiden.

```
#include <iostream>
#include <fstream>
#include <dirent.h>
#include <string>

using namespace std;

int main(int argc, char *argv[])
{
    ofstream f("-dateien.txt");

    if (f.is_open()) {
        DIR *hdir = opendir(".");

        if (hdir != NULL) {
            struct dirent *entry;

            while (entry = readdir(hdir)) {
                cout << entry->d_name << endl;

                string filename(entry->d_name);

                if (filename != "-datei.txt" &&
                    filename != "-start.cmd" &&
                    filename != "-dateien.txt" &&
                    ...)
                {
                    f << entry->d_name << endl;
                }
                zahler++;
            }

            closedir(hdir);

            cout << endl;
            ofstream g("-data.txt");

            if (g.is_open()) {
                g << zahler;
            } else {
                cerr << "Fehler: konnte Datei -data.txt nicht oeffnen" << endl;
            }
        } else {
            cerr << "Fehler: konnte Verzeichnis nicht lesen" << endl;
        }
    } else {
        cerr << "Fehler: konnte Datei -dateien.txt nicht oeffnen" << endl;
    }
}
```
Gruß


----------



## brunlorenz (10. Juni 2010)

baigox hat gesagt.:


> WinAPI?
> Ich hab mich jetzt an Dev-Cpp gewöhnt und werde auch nichts anderes nehmen!
> also was soll ich ändern?


Im Dev-C++ ist die Win32API drin (windows.h und -mwindows)


----------

