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...