Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » WIN32_FIND_DATA will irgendwie nicht so..

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
16.10.2011, 15:23 Uhr
~Dodo
Gast


Hallo,

hab folgendes Problem:
Ich versuche gerade ein Programm zu schreiben, womit ich alle Ordner von einem Verzeichnis rekursiv öffnen/dessen namen speichern kann... hier erstmal der Programmcode:

C++:
private: System::Void button2_Click_1(System::Object^  sender, System::EventArgs^  e) {
            String^ filesys;
            String^ path = "installer_stable\\\\";
            WIN32_FIND_DATA FData;
            HANDLE handler = FindFirstFile(TEXT("installer_stable\\\\*.*"),&FData);
            filesys = this->filesys(handler, path);
            ofstream datei;
            datei.open("filesys.txt");
            string writer;
            MarshalString ( filesys, writer);
            datei << writer;
            datei.close();
         }
private: String^ filesys(HANDLE handler,String^ pfad) {
             String^ doit = "";
             WIN32_FIND_DATA FData;
             String^ suchpfad = pfad;
             LPCWSTR sucher = StrToLP(suchpfad);
             HANDLE suche = FindFirstFile(sucher,&FData);
             BOOL MoreFiles = FALSE;
             if (handler == INVALID_HANDLE_VALUE) {
                doit += "Ungültiger Handle-Wert!\n";
             }
             else {
                 do {
                    const wchar_t *nameparse = FData.cFileName;
                    String^ foundName = gcnew String(nameparse);
                    if (FData.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY && foundName != "..") {
                        //doit += pfad + foundName +"\n";
                        String^ newpath = pfad + foundName + "\\\\";
                        String^ newsearcher = newpath;
                        doit += "Neue Suche: " + newsearcher + "\n";
                        const wchar_t * newsearch = ss2wchar(newsearcher);
                        WIN32_FIND_DATA RData;
                        HANDLE recursiveSearch = FindFirstFile(ss2wchar(newsearcher),&RData);
                        doit += this->filesys(recursiveSearch,newpath); // <---------------------------- REKURSION
                        FindClose(recursiveSearch);
                    }
                    else {
                        //doit += pfad + "File\n";
                        // Den Dateinamen ausgeben
                        //cout<<"(Datei) "<<FData.cFileName<<endl;
                        //cnt_file++; // Dateizähler um 1 erhöhen
                    }
                MoreFiles = FindNextFile(handler,&FData);
                } while (MoreFiles);
                 FindClose(handler);
             }
             return doit;
         }
//Umwandlungen ONLY
private: wchar_t * ss2wchar(String^ str) {
            pin_ptr<const wchar_t> wch = PtrToStringChars(str);
            size_t convertedChars = 0;
            size_t  sizeInBytes = ((str->Length + 1) * 2);
            errno_t err = 0;
            char *ch = (char *)malloc(sizeInBytes);
            err = wcstombs_s(&convertedChars, ch, sizeInBytes, wch, sizeInBytes);
            wchar_t *myWchar;
            myWchar=(wchar_t *)ch;
            return myWchar;
         }

private: LPCWSTR StrToLP(String^ s1) {
            using namespace System;
            using namespace System::Runtime::InteropServices;
            IntPtr ptr = Marshal::StringToHGlobalUni(s1);
            LPCWSTR toReturn = (LPCWSTR)ptr.ToPointer();
            Marshal::FreeHGlobal(ptr);
            return toReturn;
         }
private: void MarshalString ( String ^ s, string& os ) {
        using namespace Runtime::InteropServices;
        const char* chars = (const char*)(Marshal::StringToHGlobalAnsi(s)).ToPointer();
        os = chars;
        Marshal::FreeHGlobal(IntPtr((void*)chars));
    }


Das Funktioniert auch ganz toll... für den 1. Ordner sobald ich aber die Methode aber rekursiv aufrufe, bekomm ich als rückgabe "Ungültiger Handle-Wert", was, soweit ich weiß, heißt, dass der Handler meine Variable nicht als gültig nimmt und somit die funktion auch net weiter ausführt...hab jetzt mehrfach kontrolliert ob ich die Variablen richtig zusammenbaue etc... aber das einzige was mir jetzt noch einfällt, ist, dass irgendwas bei der Umwandlung der verschiedenen Formate irgendwas verloren geht und deshalb keine gültige "Ressource" bei heraus kommt... langsam dreh ich am rad wäre super wenn mir wer helfen könnte..

mfg Dodo

(edit durch ao: Code-Tags ersetzt durch cpp-Tags -> Syntax-Highlighting)

Dieser Post wurde am 17.10.2011 um 09:27 Uhr von ao editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
17.10.2011, 10:18 Uhr
ao

(Operator)


Dodo,
das ist der grausigste Code, den ich seit langem gesehen habe. Ich glaube dir sofort, dass du nicht mehr durchblickst.

Schmeiß das weg und fang nochmal von vorne an. Und lies dich vorher ein in System.IO.DirectoryInfo.GetFiles(), .GetDirectories() und .GetFileSystemInfos(), das ist nämlich die .NET-Version von dem, was du suchst. Du brauchst kein WINAPI dafür. Damit kannst du dir diese Marshalling- und P/Invoke-Orgie ersparen, die du (glaube ich) auch nicht richtig gemacht hast.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (WinAPI, Konsole) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: