# Dateien innerhalb von Verzeichnissen auflisten



## DaFunk2k (20. Juni 2006)

Gute Morgen zusammen, 

jetzt will ich doch auch mal ein wenig zu dieser Wissensdatenbank hinzufügen 
_*bitte bis nach unten scrollen, habe noch ein Problem*_
Ich stand gestern vor dem Problem, dass ich alle Dateien innerhalb eines Verzeichnisses auflisten wollte. Bin allerdings hier (mit meinen Suchbegriffen) nicht fündig geworden und so dachte ich mir ich stell mal den kleinen Quellcode, den ich gefunden habe, hier rein:


```
HANDLE fHandle;
WIN32_FIND_DATA wfd;

fHandle=FindFirstFile("C:\\*",&wfd);

do
{
    // Eintrag nur behandeln, wenn es nicht . oder .. ist (werden nur bei Unterverzeichnissen mit zurückgeliefert)
    // hier könnte man z.B. auch mit lstrcmp auf . und .. vergleichen, was allerdings nicht ganz so effizient ist
    if (!( (wfd.cFileName[0]=='.') && ( (wfd.cFileName[1]=='.' && wfd.cFileName[2]==0) || wfd.cFileName[1]==0 ) ))
    {
        if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
        {
            MessageBox(0,wfd.cFileName,"Folgendes Verzeichnis wurde gefunden:",0);
            // Datei ist keine, sondern ein Verzeichnis...
            // Hier könnte man dasselbe nochmal machen, um auch die
            // Unterverzeichnisse zu scannen ;-)
        }
        else
        {
            MessageBox(0,wfd.cFileName,"Folgende Datei gefunden:",0);
        }
    }
}
while (FindNextFile(fHandle,&wfd));
FindClose(fHandle);
```



nun habe ich aber auch schon gleich ein Problem:
So wie der Quellcode jetzt ist funktioniert er prima. Ich möchte nun allerdings diese Dateiennamen per TCP übertragen. Dazu habe ich bislang folgendes verwendet:

```
sprintf( welcome, "%s", wfd.cFileName);
rc = send( sockConnected, welcome, strlen(welcome), NULL);
```
Was bei einem char* auch gar kein Problem ist. Wie kann ich jetzt nur diesen cFileName, welches anscheinend ein unsigned short* ist so umwandeln, dass ich es übertragen kann?
(Wieso muss es in C eigentlich soooo viele Datentypen geben  )

Besten Dank schonmal
Andreas

PS: Vielleicht kennt jemand eine gute Seite, wo man ein wenig über die gängigsten Datentypen nachlesen kann. So richtig habe ich das ganze mit TCHAR, WCHAR u.s.w. noch nicht verstanden. Ausserdem ist short für mich immer noch ein Zahlendatentyp...wieso kann ich dem Zeichen zuweisen?
Man merkt ich bin ein C++ Newbee


----------



## MCoder (20. Juni 2006)

Du kannst die Wide Characters des TCHAR-Strings (2 Byte pro Zeichen) mit wcstombs in Multibyte Characters umwandeln, die dann in einem char gespeichert werden können. Hier ist die Anzahl der Bytes pro Zeichen variabel. Bei normalen ASCII-Zeichen wird aber nur ein Byte gebraucht, so das es für die Übertragung des Dateinamens gut geeignet sein sollte:

```
size_t nLen    = _tcslen(wfd.cFileName) * sizeof(TCHAR);
char*  pBuffer = new char[nLen + 1];
wcstombs(pBuffer, wfd.cFileName, nLen + 1);

rc = send(sockConnected, pBuffer, strlen(pBuffer), NULL);

delete [] pBuffer;
```
Gruß
MCoder


----------



## DaFunk2k (20. Juni 2006)

vielen Dank MCoder. Genau so wollte ich es haben


----------



## DaFunk2k (28. Juni 2006)

Ich mal wieder 

Wollte nicht extra ein neues Thema aufmachen, weil das Problem eigentlich ganz gut zu dem Thema passt.

Also, ich möchte so eine Art einfaches kleines FTP Programm schreiben. 

Ich habe folgende Funktine, die auf dem obigen Beispiel basiert:

```
void listDirectory(SOCKET sockConnected, char *directory);
```
Musste folgende Zeile allerdings umändern, da er unter embedded C++ wohl einen const unsigned short* haben möchte.

```
fHandle=FindFirstFile((const unsigned short*)directory,&wfd);
```

Wenn der Client die Verbindung zum Server aufbaut wird der Inhalt des Verzeichnisses aufgelistet. Dies geschieht durch den festen Code:

```
listDirectory(sockConnected, "*");
```

Anschließend fängt der Server die Tastatureingaben, die von dem Client kommen ab und wertet sie aus. Mein Client ist zur Zeit Telnet 
Es werden die Tastatureingaben gesammelt bis ein \n durch die Returntaste kommt. Dann werden \r und \n entfernt. Anschließend rufe ich, falls die Variable buu != "exit" ist wieder die Funktion listDirectory auf. Wenn ich aber ein *, also das gleiche was ich fest im Quellcode am Anfang schon einmal stehen habe, eingebe, dann findet er diesesmal keine Dateien. Beim Debuggen zeigt er mir aber, dass der Inhalt der Variable directory derselbe ist.

```
do	{
		
		do	{
			rc = recv(sockConnected, recvBuf, RECV_BUF_MAXLEN, NULL);
			for (int i = 0; i < rc; i++)	{
				buu[index]=recvBuf[i];
				index++;
			}
		} while (recvBuf[rc-1]!='\n');
		buu[index-2] = '\0';
		index=0;
		if ( (strcmp(buu,"exit") != 0) )	{
			listDirectory(sockConnected, buu);
		}


	}	while (strcmp(buu,"exit") != 0 );
```

Weiß vielleicht jemand wo mein Denkfehler oder der Programmfehler steckt?

Schönen Gruß
Andreas


----------

