# C++ Nur Dateien mit bestimmter Endung ausgeben



## Puepue (3. Juni 2010)

Ich habe diese Funktion:


```
#include <dirent.h>
#include <conio.h>
#include <iostream>

using namespace std;

void readdirectory(void)
{
    DIR *hdir;
    struct dirent *entry;

    hdir = opendir(".");
    do
    {
        entry = readdir(hdir);
        if (entry)
        {
			 if ( 
				 strchr(entry->d_name, (int)'.') != NULL 
				 && 
				 strchr(entry->d_name, (int)'t') != NULL  
				 && 
				 strchr(entry->d_name, (int)'x') != NULL 
				)
			 {
				cout << entry->d_name << endl;
			 }
            //cout << entry->d_name << endl;
        }
    } while (entry);
    closedir(hdir);

	cout << "Das wars";
	getch();
}
```

So werden alle Dateien aus dem aktuellen Verzeichnis ausgelesen, in deren Dateinamen mid. ein . ein t und ein x vorkommen. Ich will aber bspw. nur Dateien mit der Endung .txt auslesen. Wie mach ich das am besten?


----------



## Olstyle (4. Juni 2010)

Ich würde versuchen Stellen weise zu lesen.
Erst den Punkt suchen, dann dahinter vergleichen ob ein t, ein x und ein t kommen.

Wie das dann genau in C aussieht weiß ich allerdings nicht.


----------



## Puepue (4. Juni 2010)

Habe es jetzt so gemacht:


```
void gebeAlleDateienAus(char directory[ ], char endung[ ] )
{
    DIR *hdir;
    struct dirent *entry;

    hdir = opendir(directory);
    do
    {
        entry = readdir(hdir);
        if (entry)
        {
			if ( strstr(entry->d_name, endung) != NULL )	// Nur Dateien anzeigen, die .txt im Dateinamen haben
			{
				cout << entry->d_name << endl;
			}
            //cout << entry->d_name << endl;
        }
    } while (entry);
    closedir(hdir);

}
```

Man müsste nun noch eine Positionsangabe einbauen. 
So könnte ja auch
abc.txt.doc korrekt sein.

Hat jemand einen Google-Tipp für mich, wie ich das nur ausgeben kann, wenn .txt bei -4 von der Länge des Dateinamens anfängt?


----------



## Bauer87 (5. Juni 2010)

Wie wäre es, wenn du tatsächlich den MIME-Type und nicht den Dateinamen anschaust? Das jetzt fliegt dir in gleich mehreren Fällen um die Ohren:

Die Datei hat ein .txt irgendwo im Namen. (info.txt.doc ist kein Text)
Deine Textdatei ist komprimiert. (info.txf.bz2 ist eine Textdatei.)
Jemand verzichtet komplett auf Endungen oder nutzt sie anders. (info kann eine Textdatei sein, info.text ist es sogar sehr wahrscheinlich.)
Eine Datei, die keinen Text enthält, endet zufällig auf .txt. (hjf.sdt.rto.txt ist wahrscheinlich einfach Datenmüll.)

Es über den Dateinamen zu machen, ist aber sicherlich einfacher. Das andere würde wohl am besten übe die Dateitypen-Erkennungs-API deines Betriebssystems laufen. Für Typenerkennung über den Dateinamen würde ich einfach hinten anfangen, ihn einzulesen und dann schauen, ob dort txt. steht (also in umgekehrter Reihenfolge einlesen). Das sollte ja recht einfach gehen, wenn du den Lesepointer auf das Ende des Namens setzt und dann nach vorne durchrutscht. So musst du dann auch maximal vier Buchstaben einlesen und vergleichen.


----------



## Puepue (5. Juni 2010)

Hmm wie würde das denn mit der API funktionieren?
Beim Googlen finde ich da nicht wirklich was, vielleicht google ich auch nur das falsche ...


----------



## Bauer87 (5. Juni 2010)

Ich arbeite bei so was mit Qt. Endung auslesen geht da mit:

```
QString QFileInfo::completeSuffix () const
```
Und Mime testen geht über folgendes:

```
bool QMimeData::hasText () const
```

PS: Unter Windows soll ExtractFileExt Dateiendungen auslesen. Mir ist gerade eingefallen, dass Windows selber auch nur nach den Dateinamen geht und damit alle Versuche, den Dateitypen direkt zu bestimmen, wohl eh überflüssig wären. (Bei Windows wurde ja auch immer behauptet, dass man den Dateitypen ändert, wenn man die Datei umbenennt…)


----------



## Puepue (6. Juni 2010)

Also mir hat neulich ein Kollege auf der Konsole gezeigt, wie er eine .tif datei in irgendwas anderes umbenannt hat und trotzdem stand da noch bei type TIFF .. sowas wäre ja optimal aber vermutlich zu viel Aufwand. 
Das ganze sollte ursprünglich darauf hinauslaufen, dass ich anhand einer Signatur erkennen kann, mit welchem Algorithmus eine Datei verschlüsselt wurde. Ich hab mir dann gedacht, dass man mit Dateiendungen anfangen könnte .. also .txt ist unverschlüsselt und .sky ist mit skytale verschlüsselt etc.
Dann kann ich zwar immernoch hingehen und meine Dateien umbenennen, aber dann hab ich dann "halt pech gehabt"^^


----------



## Bauer87 (6. Juni 2010)

Wie gesagt: Dafür dürfte Windows eine API mitbringen — würde ich von einem Betriebssystem auf jeden Fall erwarten. Lies doch einfach mal die Doku zur Windows-API.


----------

