Problem beim auflisten von Ordnerinhalten



  • 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