Problem mit FindFirstFile



  • Hallo zusammen!

    Bei uns im Studium (TU Chemnitz) sollen wir für die Vorlesung Betriebssysteme kleine Programme schreiben um mal zu sehn, was Betriebssysteme so machen. Erste Aufgabe war, die Summe aller Dateigrößen eines Verzeichnisses zu berechnen.

    Ich hab nun Probleme bei der Lösung unter Windows. Und zwar ist das Ergebnis von FindFirstFile immer INVALID_HANDLE_VALUE.

    Hier mal mein Code:

    #include <stdio.h>
    #include <stdlib.h>
    #include <windows.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    
    unsigned int sumOfFileSizes(char *path)
    {
     	char 			dirname[MAX_PATH];
     	unsigned int 	sum 						= 0;
     	WIN32_FIND_DATA fileInfos;
       	HANDLE 			hFind 						= INVALID_HANDLE_VALUE;
       	DWORD			dwError;
    
    	strcpy (dirname, path);
    	//strncpy (dirname, path, strlen(path)+1);
       	strcat (dirname, "\\*");
    	//strncat (dirname, "\\*", 3);
    
       	hFind = FindFirstFile(dirname, &fileInfos);
    
        if (hFind == INVALID_HANDLE_VALUE) 
        {
    		printf ("Invalid file handle. Error is %u\n", GetLastError());
        	return 0;
       	} 
       	else 
       	{
       		if ((fileInfos.cFileName != ".")||
       			(fileInfos.cFileName != ".."))
       		{
       			if (fileInfos.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY)
       				sum += sumOfFileSizes(fileInfos.cFileName);
       			else sum += (fileInfos.nFileSizeHigh * (MAXDWORD+1)) + fileInfos.nFileSizeLow;
       		};
    
          	while (FindNextFile(hFind, &fileInfos) != 0) 
          	{
             	if ((fileInfos.cFileName != ".")||
    	   			(fileInfos.cFileName != ".."))
    	   		{
    	   			if (fileInfos.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY)
    	   				sum += sumOfFileSizes(fileInfos.cFileName);
    	   			else sum += (fileInfos.nFileSizeHigh * (MAXDWORD+1)) + fileInfos.nFileSizeLow;
    	   		};
          	}
       	}
    
       	printf("%s", path);
       	dwError = GetLastError();
       	FindClose(hFind);
      	if (dwError != ERROR_NO_MORE_FILES) 
      	{
         	printf ("FindNextFile error. Error is %u\n", dwError);
         	return (0);
      	}
    
    	return sum;
    };
    
    // Mainfunction
    int main (int argc, char *argv[])
    {
     	/*if (argc != 2) //check if exactly 1 parameter is given (path for sumation)
     	{
     		printf("Call program with exactly one parameter. (FileSizeCounter <startpath>)\n");
     		printf(" (FileSizeCounter will count all sub directorys, too!)");
     	} else printf("Sum of the size of all files in all sub directorys: %u\n",sumOfFileSizes(argv[1]));*/
    
     	printf("Sum of the size of all files in all sub directorys: %u\n"
                , sumOfFileSizes("C:\\Programmieren\\EclipsePorjects\\Betriebssysteme\0"));
     	return 0;
    }
    

    Das es in der Main() so wild aussieht, liegt daran, dass ich Probleme hatte in meiner GUI Parameter zu übergeben. Deshalb erstmal diese Manuelle Pfadangabe. Ich hab selbige auch schon ohne dem "\0" probiert. Ändert aber nix.

    Könnt ihr mir sagen wieso nun FindFirstFile mir kein gültiges Handle gibt?



  • Für den rekursiven Aufruf musst du dir erst den Pfad wieder aus path und fileInfos.cFileName zusammensetzen, da in letzerem nur der Verzeichnisname steht und nicht der vollständige Pfad 😉



  • Stringvergleiche macht man mit (l)strcmp.



  • Danke euch beiden. Das wären bestimmt zwei Probleme gewesen, auf die ich noch gestoßen wäre. Das Problem ist allerdings, dass bereits bei FindFirstFile ein ungültiges Handle naja...eher kein Handle zurückgeliefert wird.
    Soweit kommt das Programm also gar nicht.



  • hoi

    vielleicht liegt der fehler in

    printf("Sum of the size of all files in all sub directorys: %u\n"
           ,sumOfFileSizes("C:\\Programmieren\\EclipsePorjects\\Betriebssysteme\0"));
    

    Sollte der pfad vielleicht

    "C:\\Programmieren\\EclipseP[b]rojects[/b]\\Betriebssysteme\0"
    

    heissen ?

    Meep Meep



  • KFlash schrieb:

    Das Problem ist allerdings, dass bereits bei FindFirstFile ein ungültiges Handle naja...eher kein Handle zurückgeliefert wird.
    Soweit kommt das Programm also gar nicht.

    Bei mir trat bei deinem Code dieser Fehler erst beim 2. (rekursiven Aufruf auf) - also der erste Aufruf von FindFirstFile lieferte ein gültiges Handle...


Anmelden zum Antworten