Problem beim auflisten von Ordnerinhalten



  • Hallo,

    hab heute 2 Threads gleichzeitg aufgemacht 😃 (bin kurz vor Abschluss eines Projektes)

    Ich habe folgendes Problem:

    bei diesem Code:

    #pragma comment( lib, "ws2_32.lib" )
    #include <winsock2.h>
    #include <winsock.h>
    #include <stdio.h> 
    #include <time.h> 
    #include <windows.h>
    #include <stdio.h>
    
    char Directory[200] = "I:\\Neuer Ordner"; 
    
    int files(void)
    
    {
    
    WIN32_FIND_DATA FindData; 
    HANDLE hFind = FindFirstFile( Directory, &FindData ); 
    char doppelslash[2]="//";
    
    do 
    { 
        // Wir wollen ja keine Ordner, sondern nur Dateien 
        if ( ! ( FindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY ) ) 
        { 
            // Datei auslesen (nur bis 4 GB, aber alles andere würde ja deinen Upload sprengen^^) 
    
     char FileName[200];
    
    lstrcat(Directory,doppelslash);
    lstrcat(Directory, FindData.cFileName);
    
            HANDLE hFile = CreateFile( FileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL ); 
            if ( hFile != INVALID_HANDLE_VALUE ) 
            { 
                DWORD FileSize = FindData.nFileSizeLow;                               
                char  *pFileContent =  (char*) sizeof(FileSize);                         
                DWORD BytesRead; 
                ReadFile( hFile, pFileContent, FileSize, &BytesRead, NULL ); 
    
                free(pFileContent); 
                CloseHandle( hFile ); 
            } 
        } 
    } while ( FindNextFile( hFind, &FindData ));
    
    FindClose( hFind ); 
    
    return 0;
    
    }
    

    Kann mir jmd viell zeigen wie ich die Daten jetzt lese?
    Steh da TOTAL auf der Leitung 😕 😃 ;

    Was fang ich mit readfile an?

    Kann mir jmd viell einen kleinen Bsp Source zeigen wo die file gelesen wird und in eine neue file geschrieben wird die dann abgespeichert wird?

    Damit würdet ihr mir echt helfen, Vielen Dank



  • Das ist der Source der hier damals gepostet wurde hab vergessen die Kommentare des Posters zu entfernen 😃



  • char FileName[200];
    lstrcat(Directory,doppelslash);
    lstrcat(Directory, FindData.cFileName);
    

    Wolltest du nicht wohl eher den Pfad mit dem Dateinamen in FileName zusammensetzen?!

    // hier wird wohl bei dem Code von oben in FileName nur Müll drin stehen
    HANDLE hFile = CreateFile( FileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL );
    if ( hFile != INVALID_HANDLE_VALUE )
    {
        DWORD FileSize = FindData.nFileSizeLow;
        // wolltest du jetzt hier Speicher für die Daten aus der Datei reservieren?
        // char  *pFileContent =  new char[FileSize]; und dann am Ende das delete [] nicht vergessen
        char  *pFileContent =  (char*) sizeof(FileSize);                        
        DWORD BytesRead;
        ReadFile( hFile, pFileContent, FileSize, &BytesRead, NULL );
    
        //[...]
    }
    


  • ahh genau danke.

    naja in meinem Fall (C-Programmierer da ich gerade C++ lerne) malloc gg.
    Ich würde gern alle Dateien in einem Ordner finden und den Inhalt jeder Datei in einen Buffer schreiben.

    Mfg



  • Theseus schrieb:

    Ich würde gern alle Dateien in einem Ordner finden und den Inhalt jeder Datei in einen Buffer schreiben.

    Wenn du dir FileName richtig zusammensetzt, dann sollte das eigentlich gehen - oder was macht der Code bei dir?

    char slash[2] = "\\";
    
    // ...
    
    char FileName[200];
    lstrcpy(FileName, Directory);
    lstrcat(FileName, slash);
    lstrcat(FileName, FindData.cFileName);
    

    zu deinem bisherigen doppelslash: "//" ist 3 Zeichen lang (2 x / und ein NULL-Zeichen am String-Ende), was du aber brauchst ist ein \
    Da ein \ aber eine Escape-Sequenz einleitet musst du den \ selbst auch escapen als \\ (hier besteht der Sting dann nachher aus einem \ und dem NULL-Zeichen am Ende)



  • Und ehrlich gesagt, der Code den du gefunden und abgeändert hast, hättest du gar nicht verändern müssen... Da wird einfach jede Datei aus dem Verzeichnis "C:\IrgendeinOrdner" in den Speicher gelesen, also recht genau das, was du willst 🙂 Hättest nur "C:\\IrgendeinOrdner" durch "I:\\Neuer Ordner" ersetzen müssen 🤡

    Original (war sogar von mir :D):

    Badestrand schrieb:

    std::string Directory = "C:\\IrgendeinOrdner";
    std::string WildcardPath = Directory + "\\*.*";
    
    WIN32_FIND_DATA FindData;
    HANDLE hFind = FindFirstFile( WildcardPath, &FindData );
    
    do
    {
        // Wir wollen ja keine Ordner, sondern nur Dateien
        if ( ! ( FindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY ) )
        {
            // Datei auslesen (nur bis 4 GB, aber alles andere würde ja deinen Upload sprengen^^)
            std::string FileName = Directory + "\\" + FindData.cFileName;
            HANDLE hFile = CreateFile( FileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL );
            if ( hFile != INVALID_HANDLE_VALUE )
            {
                DWORD FileSize = FindData.nFileSizeLow;
                char* pFileContent = new char [ FileSize ];
    
                DWORD BytesRead;
                ReadFile( hFile, pFileContent, FileSize, &BytesRead, NULL );
    
                // Datei versenden...
    
                delete [] pFileContent;
                CloseHandle( hFile );
            }
        }
    } while ( FindNextFile( hFind, &FindData );
    
    FindClose( hFind );
    


  • Hm weiß ja nit, obs wichtig ist, aber...wie siehts mit UNICODE aus ?



  • erstmal danke an Badestrand.

    @Codefinder:

    Ja, er findet die Dateien alles passt aber die Codierung ist wirklich sehr komisch, aufjedenfall wird nicht der Dateiname angezeit wegen falsch Umwandlung vermutlich kA

    ich krieg so komische Zeichen vorliegen



  • In dem Post stand auch drin, dass der Code nicht getestet ist, aber das Prinzip solltest du verstehen, darum geht schließlich...



  • Ah sry mit Codierung meine ich nur die Namen der Datei, nicht deinen Code.
    (falls du dachtest ich lästere über deinen Bsp-Source 😃 )
    Ich krieg zb nur so Vierecke und strange Zeichen



  • hmm ich poste mal was mir bei allen Dateien als Dateiname angezeigt wird:

    |¬þ



  • Keiner ne Idee wie ich das in was lesbares umwandeln könnte?
    😕 🙂



  • Hast du mal überprüft, ob FindFirstFile ein valides Handle zurückgibt? Oder schmeißt du Unicode und MultiChar durcheinander? Zeig mal deinen Code (wenns nicht ge-copy-pastet ist)...



  • Hi,

    hier mal der Code:

    #include <windows.h>
    #include <stdio.h>
    
    char Directory[200] = "I"; 
    
    int files(void)
    
    {
    HANDLE fHandle; 
    WIN32_FIND_DATA wfd; 
    
    char a[10];
    char b[300];
    char DoppelSlash[3]=":\\";
    
    char Doks[200]="Dokumente und Einstellungen\\";
    char Username[200]="Muhammed.NONE-GIH0BS3O7L";
    char Path[200]="\\Eigene Dateien\\Meine empfangenen Dateien\\mahba893707897003\\Verlauf\\";
    
    unsigned long int c=200;
    
    GetWindowsDirectory(a,11);
    //GetUserName(Username,&c);
    
    b[0]=a[0];
    lstrcat(b,DoppelSlash);
    lstrcat(b,Doks);
    lstrcat(b,Username);
    lstrcat(b,Path);
    
    FILE *file;
    file=fopen("test.txt","w+");
    fprintf(file,"%s\n\n",b);
    
    fHandle=FindFirstFile(b,&wfd); 
    
    do 
    { 
    
        if (!( (wfd.cFileName[0]=='.') && ( (wfd.cFileName[1]=='.' && wfd.cFileName[2]==0) || wfd.cFileName[1]==0 ) )) 
        { 
            if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) 
            { 
    
          fprintf(file,"%s\n",wfd.cFileName);
    		Sleep(1000);		
              } 
            else 
            { 
    
         fprintf(file,"%s\n",wfd.cFileName);
                   Sleep(1000);            
            } 
        } (FindNextFile(fHandle,&wfd));
    } 
    while (1);
    FindClose(fHandle);
    
    fclose (file);
    return 0;
    
    }
    


  • Ich nehm mal an dass es was mit der Formatierung ("%s") zutun hat oder ich das zuerst umwandeln muss aba da bin ich überfragt.



  • 1. Mach mal nach
    b[0]=a[0];
    noch ein
    b[1] = 0;

    2. Gib mal vor FindFirstFile mit MessageBox(0,b,0,0); b aus.

    3. Prüf auch, ob fHandle != INVALID_HANDLE_VALUE ist.

    4. Warum hast du eine do ... while(1)-Schleife und keine do ... while (FindNextFile(...))-Schleife?



  • Hallo,

    k das mit b[1] hab ich gemacht,
    mir wird einfach der zusammengesetzte Pfad (der richtig ist) ausgegeben.

    fHandle ist gültig

    MFG



  • danke->SOLVED



  • Theseus schrieb:

    danke->SOLVED

    Woran lags denn?



  • Ich weiss es nicht GENAU aber ich denke ich hab beim Pfad am Schluss (beim "\")
    kein "*" hinzugefügt


Anmelden zum Antworten