Mehrere Dateien einlesen
-
Danke für das Beispiel, aber das ist mir zu "Umfangreich", und ich mag nichts hernehmen ,das ich nicht entweder selbst gemacht habe, oder wovon ich nicht alles 100% verstehe.
Habe mittlerweile , im Vergleich zu Deiner Lösung wohl "recht billige" Variante erstellt, die für meine Zwecke ausreicht.
Wer Lust hat kann ja mal drüber sehen, Code folgt
-
void fhandler(F_HANDLE *ptr){ int run=0; WIN32_FIND_DATAA find_data; HANDLE find_handle = FindFirstFileA( "*", &find_data ); ptr->count=0; while( FindNextFileA( find_handle, &find_data ) ) { if( strcmp(find_data.cFileName, "..") != 0){ if (strstr (find_data.cFileName,".exe") == NULL){ //puts( find_data.cFileName ); strcpy(&ptr->data[run++][_STR], find_data.cFileName); ptr->count++; } } } }//END
fhandler.h
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <windows.h> #define _FH_LENGTH 125 #define _FH_FILES 20 #define _STR 0 typedef struct{ char data[_FH_FILES][_FH_LENGTH]; int count; }F_HANDLE; void fhandler(F_HANDLE *ptr);
-
Jetzt mal auf die Schnelle:
-Alle Namen, die mit einem Unterstricht beginnen und wo danach ein Großbuchstabe folgt sind für die Implementierung reserviert, deine Markos haben also falsche Namen.
-die erste Datei wird nicht gefunden (das ist afaik zwar eh immer '.', also das aktuelle Verzeichnis, aber trotzdem)
-das Pattern ".exe" als Ausschluss hardzucoden ist nicht sonderlich schön, dann musst du später den Code anpassen, wenn du den ggf. wieder verwenden willst und das verletzt das Open-Closed-Principle
-Welche genaue Bedeutung hat _STR? Ein Offset im zweiten Array?
-_FH_LENGTH solltest du umbenennen (s.o) und als MAX_PATH definieren, das ist die maximale Länge eines Files unter Windows
-Alle includes in fhandler.h sind aktuell überflüssig (bzw. bis auf windows.h wenn du MAX_PATH nutzt), du solltest sie entfernen;
in der .c dann nur die includieren, die du brauchst (windows.h, wenn nicht schon im Header, und string.h)
-
- Wofür
_STR
? - Wofür die ganzen includes im Header?
_FH_LENGTH
sollteMAX_PATH
sein.- Der Datentyp für Speichergrößen ist
size_t
aus<stddef.h>
, nichtint
. - Wenn eine Anzahl von Dateien größer
_FH_FILES
gefunden werden kackt dein Code ohne Fehlerbehandlung ab. - Wofür
run
infhandler()
? Der selbe Wert steht auch immer inptr->count
. - Du Wertest das erste Ergebnis (
find_data
nachFindFirstFile()
) nicht aus und "übersiehst" dadurch immer eine Datei. if (strcmp(find_data.cFileName, "..") != 0) /* ... */
schließt nur/.
und/..
aus - anderen Verzeichnisse landen in deiner Liste.if (strstr (find_data.cFileName,".exe") == NULL){
Prüft nicht die Extension gegen".exe
sondern schlägt immer an, sobald sich".exe"
irgendwo im Dateinamen befindet.strcpy(&ptr->data[run++][_STR], find_data.cFileName);
...strcpy( ptr->data[ ptr->count ], find_data.cFileName);
täts auch ...FindClose(find_handle);
fehlt.- Fehlerbehandlung fehlt komplett.
- Bezeichner, die mit einem Underscore beginnen sind reservierte Bezeichner und dürfen nicht verwendet werden (§7.1.3.1).
- Wofür
-
_STR ist für die Katz, wenn ich an strcpy ohen "&" übergebe.
•Du Wertest das erste Ergebnis (find_data nach FindFirstFile()) nicht aus und "übersiehst" dadurch immer eine Datei.
Ist bei mir immer "."
if (strstr (find_data.cFileName,".exe") == NULL){ Prüft nicht die Extension gegen ".exe sondern schlägt immer an, sobald sich ".exe" irgendwo im Dateinamen befindet.
Stimmt, aber ich habe keine Dateien die "test.exeample.pdf" heißen oder so.
Rest bisschen nachgebessert:
fhandler.h#include <windows.h> #define FH_LENGTH 125 #define FH_FILES 20 typedef struct{ char data[FH_FILES][FH_LENGTH]; int count; }F_HANDLE; int fhandler(F_HANDLE *ptr);
fhandler.c
#include <stdio.h> #include <stdlib.h> #include <string.h> #include "fhandler.h" int fhandler(F_HANDLE *ptr){ WIN32_FIND_DATAA find_data; HANDLE find_handle = FindFirstFileA( "*", &find_data ); ptr->count=0; while( FindNextFileA( find_handle, &find_data ) ) { if( strcmp(find_data.cFileName, "..") != 0){ if (strstr (find_data.cFileName,".exe") == NULL){ //puts( find_data.cFileName ); strcpy(ptr->data[ptr->count++], find_data.cFileName); if (ptr->count >= FH_FILES){ puts("Max defined in FH_FILES exceeded\n"); system("pause"); return 1; } } } } FindClose(find_handle) ; }//END
main.c
#include <stdio.h> #include <stdlib.h> #include <windows.h> #include <string.h> #include "fhandler.h" int main(int argc, char *argv[]) { char *filename; int z1, run; //____BEGIN_____________ F_HANDLE verz; fhandler(&verz); filename=malloc(FH_LENGTH); if(!filename){ puts("dreck"); return 0; } for(run=0; run<verz.count; run++){ strcpy(filename, verz.data[run]); printf("Datei Nr.: %2d Name : %s\n", run, filename); } free(filename); return 0; }
Es sind viele #includes, aber meine IDE (Dev C++ ... ja ich weiß, aber auf Arbeit geht´s hald nicht anders) motzt sonst.
-
Swordfish schrieb:
_FH_LENGTH
sollteMAX_PATH
+ 1 sein.
"+ 1" ist überflüssig. Vgl. http://msdn.microsoft.com/en-us/library/aa365247.aspx
-
Tatsächlich!
-
Nathan schrieb:
-die erste Datei wird nicht gefunden (das ist afaik zwar eh immer '.', also das aktuelle Verzeichnis, aber trotzdem)
Der erste Eintrag ist wohl meistens '.', aber nicht im Root-Directory, z. B. mit lpFileName = "C:\*" bei FindFirstFile.