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. |