WIN32_FIND_DATA will irgendwie nicht so..



  • 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:

    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



  • Du solltest kein C++/CLI mit C/C++ mischen... das macht keinen Sinn...

    Verwende bitte:
    System::IO::Directiry::GetFiles!


  • Mod

    Und diese Funktion ist ein Witz oder?

    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; 
             }
    


  • Dieser Thread wurde von Moderator/in Martin Richter aus dem Forum MFC (Visual C++) in das Forum C++/CLI mit .NET verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • So ist dass, wenn man nicht weiss, was man tut... und dann auch nich C++/CLI verwenden... das ist das reinste Chaos...

    Nimm bitte C# oder mach C/C++... aber bitte kein C++/CLI (oder machst Du ein ein Kurs bei ILS?)

    Siehe auch:
    http://blog.kalmbach-software.de/de/2010/03/05/ccli-und-winforms-macht-keinen-sinn/


Log in to reply