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 sollte MAX_PATH sein.
    • Der Datentyp für Speichergrößen ist size_t aus <stddef.h> , nicht int .
    • Wenn eine Anzahl von Dateien größer _FH_FILES gefunden werden kackt dein Code ohne Fehlerbehandlung ab.
    • Wofür run in fhandler() ? Der selbe Wert steht auch immer in ptr->count .
    • Du Wertest das erste Ergebnis ( find_data nach FindFirstFile() ) 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).


  • _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 sollte MAX_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.


Anmelden zum Antworten