Hilfestellung Verzeichnis auflisten bzw. Dateien auslesen
-
Die Variable an sich dürfte/sollte nicht ins unermessliche wachsen, aber ich weiß nicht, ob du den Garbage Collector überlastet hast. Hängt es denn von der Größe der Dateien ab, wann der Absturz passiert (versuch' mal ein anderes Verzeichnis)?
Ansonsten nochmal mein Hinweis von oben: setz mal den gesamten Code in ein try-catch und werte dann die Informationen aus der ankommenden Exception aus.
-
CStoll schrieb:
Hängt es denn von der Größe der Dateien ab, wann der Absturz passiert (versuch' mal ein anderes Verzeichnis)?
Ich hab es gerade mal mit anderen Dateien vom selben Typ versucht.(Die halb so groß waren)Da durchlief er die Schleife bis zur 16. Datei.
Also ist wohl die Größe mal der Anzahl der Dateien das Problem?
Wir reden hier von Textdateien die 12KB groß sind.Hat irgendjemand einen Ansatz.
-
Hallo,
die Exception System.ExecutionEngineException deutet ja eher auf einen internen CLR-Fehler hin.
Hantierst du denn auch mit COM-Objekten, denn bei falschen Funktionsparametern könnte evtl. auch diese Exception geworfen werden?Und hast du denn schon das SP1 für dein VS 2008 installiert?
-
Zeig doch mal den Callstack, wenn der Fehler auftritt!
Ich kann mit auch nicht vorstellen, dass Du uns allen relevanten Code gezeigt hast...
-
Hier der vollständige Code.Nicht wundern ich komme ursprünglich aus der C-Welt.Demenstprechend sieht der Code auch aus:
public: System::Void Startbutton_Click(System::Object^ sender, System::EventArgs^ e) { String ^Variable1 = VariabletextBox1->Text; String ^pg= PGcomboBox->Text; String ^Variable2 = VariabletextBox2->Text; String ^Variable3 = VariabletextBox3->Text; WIN32_FIND_DATA dir; HANDLE fhandling; static char verzeichnis[]="C:\\User\\"; if(pg == "abc") { strcpy(verzeichnis,"C:\\User\\abc"); } else if(pg== "def") { strcpy(verzeichnis,"C:\\User\\def\\"); } else if(pg == "hij") { strcpy(verzeichnis,"C:\\User\\hij\\"); } else if(pg == "klm") { strcpy(verzeichnis,"C:\\User\\klm\\"); } else if(pg == "nop") { strcpy(verzeichnis,"C:\\User\\nop\\"); } else if(pg == "qr") { strcpy(verzeichnis,"C:\\User\\qr\\"); } else if(pg == "stu") { strcpy(verzeichnis,"C:\\User\\stu\\"); } else if(pg == "vwx") { strcpy(verzeichnis,"C:\\User\\vwx\\"); } char Suche[]="*.*"; //Für die Allgemeine Suche int Zaehler=0; //Zähler für die Anzahl kopierter bzw. neu geschriebener Dateien strcat(verzeichnis,Suche); //Hänge Suche an verzeichnis für die allgemeine Suche if(Variable1=="" || Variable2=="" || Variable3=="") //Wenn bei den Variablen nichts eingetragen wurde dann... { MessageBox::Show("Bei allen Feldern ist eine Eingabe erforderlich!","Eingabe korrekt?",MessageBoxButtons::OK,MessageBoxIcon::Error); } else { fhandling=FindFirstFile(verzeichnis,&dir); //die ersten beide Fünde sind unbrauchbar,da diese die Ordneroptionen von Windows darstellen FindNextFile(fhandling,&dir); // siehe oben FindFirst if(FindNextFile(fhandling,&dir)==NULL) { MessageBox::Show("Der Quellordner ist leer.Keine Daten zum Selektieren vorhanden!","Quellordner?",MessageBoxButtons::OK,MessageBoxIcon::Error); } else { FindClose(fhandling); String ^verzeichnis2="C:\\User\\"; StringBuilder ^ver = gcnew StringBuilder(verzeichnis2); if(pg == "abc") { ver->Append("abc\\"); } else if(pg == "def") { ver->Append("def\\"); } else if(pg == "ghi") { ver->Append("ghi\\"); } else if(pg == "jkl") { ver->Append("jkl"); } else if(pg == "lmn") { ver->Append("lmn\\"); } else if(pg == "op") { ver->Append("op\\"); } else if(pg == "qrs") { ver->Append("qrs\\"); } else if(pg == "tuv") { ver->Append("tuv\\"); } verzeichnis2 = ver->ToString(); try { array<String^> ^Dateien = Directory::GetFiles(verzeichnis2); String^ Inhalt; for each(String^ Dateiname in Dateien) { Inhalt=""; Inhalt=File::ReadAllText(Dateiname); //if(Inhalt->IndexOf(Inhalt,Variable1)!=-1 && Inhalt->IndexOf(Inhalt,pg)!=-1 && Inhalt->IndexOf(Inhalt,Variable2)!=-1 && Inhalt->IndexOf(Inhalt,Variable3)!=-1) //{ // MessageBox::Show("Übereinstimmung!","Eingabe korrekt?",MessageBoxButtons::OK,MessageBoxIcon::Error); //} } //Ende for each } catch(Exception ^e) { MessageBox::Show("Unerwarteter Fehler","Eingabe korrekt?",MessageBoxButtons::OK,MessageBoxIcon::Error); } } // Ende des else bei der Prüfung ob eine Datei im Ordner ist } //else Ende }
Wenn ich wüsste was mit CallStack gemeint wäre würde ich diesen ebenfalls liefern.
Leider hab ich mit VC++ nicht alzu viel Erfahrung.Ich bitte das zu entschuldigen.Ich tu mein bestes...
-
Lass Die Finger von C++/CLI.
Du mischtst managed und native Code und merkst es nicht mal.
Nimm C# oder C++ (native).
-
Sorry das zu schreiben, aber dein Code ist grausam!
Du solltest dich zuersteinmal grundsätzlich entscheiden, was du programmieren willst: C, C++ oder C++/CLI, s.a. Windows Forms und Visual C++ MACHT KEINEN SINN!.
Und dein Fehler ist, daß du dir deinen Stack zerschossen hast!!!
Mittelsstatic char verzeichnis[]="C:\\User\\";
reservierst du dir nur exakt soviel Speicher, wie das String-Literal lang ist (+ abschließendes Nullzeichen).
Und dann schreibst du mittelsstrcpy(verzeichnis,"C:\\User\\abc\\"); // etc.
in nicht von dir reservierten Speicher hinein.
Mittels Path.Combine(...) kannst du viel eleganter Pfade zusammensetzen (wenn du schon .NET verwendest). Dann schmeiß' aber auch den gesamten C (und WinAPI)-Kram raus. Und schau dir die Klassen 'File' und 'Directory' an...
Und dann verwende am besten gleich C# dafür.Oder aber du bleibst bei C und reiner WinAPI oder aber C++ und verwendest eine passende GUI, s.a. [HOWTO] Welches Toolkit für GUIS?.
-
Zu meiner Verteidigung:
Der erste Teil hab ich in einem vorigen Projekt implementiert gehabt und hab Ihn so übernommen nur um zu sehen ob es überhaupt so funktioniert wie ich es mir ausmalte.
Der erste Teil (also verzeichnis) ist nur für die FindFirst bzw. FindNext API,um zu sehen ob das verzeichnis leer ist.
im zweiten Teil erzeug ich ein verzeichnis2 mit dem ich eigentlich operiere und der auch benutzt wird um das Verzeichnis auszulesen.Angedacht war das ich den kompletten Code ins .Net schreibe.ICh dachte fürs erste ginge es auch so.Nur um zu sehen ob die Grundidee funktioniert.
-
Ich denke ihr könnt das Thema schließen.
Wenn ich reinen .Net Code verwende funktioniert es.Vielen Dank für die Hilfestellung.
Eine bitte vielleicht noch:
Könnt ihr das komplette Thema löschen?Ist ja schon fast peinlich...
Das Thema reicht nicht mal als Warnung wie man es nicht machen sollte.
Aber trotzdem vielen Dank...Hat mich auf jeden Fall weiter gebracht und es war mir eine Lehre...
-
Th69 schrieb:
Und dein Fehler ist, daß du dir deinen Stack zerschossen hast!!!
Mittelsstatic char verzeichnis[]="C:\\User\\";
Man beachte auch, dass es überhaupt nicht zu "zerschießen" des Stacks kommt, da per Default string-Litertals in enem Read-Only bereich abgelegt werden. Es tritt somit eine Access Vialoation bei dem strcpy auf...
-
Jochen Kalmbach schrieb:
Th69 schrieb:
Und dein Fehler ist, daß du dir deinen Stack zerschossen hast!!!
Mittelsstatic char verzeichnis[]="C:\\User\\";
Man beachte auch, dass es überhaupt nicht zu "zerschießen" des Stacks kommt, da per Default string-Litertals in enem Read-Only bereich abgelegt werden. Es tritt somit eine Access Vialoation bei dem strcpy auf...
Darf ich dich darauf aufmekrsam machen, daß DAS kein String-Literal ist, sondern die Initialisierung eines Zeichen-Arrays? Dieses liegt zwar nicht auf dem Stack, sondern im globalen Datenbereich, aber trotzdem ist es änderbar - und eine Überschreitung der Array-Grenzen vernichtet vermutlich andere globale/statische Variablen.
-
Ja, Du hast recht... ich bin heute irgendwie durch den Wind...
Sowas wäre es gewesen:char* test = "Hallo Welt";
-
Jochen Kalmbach schrieb:
und eine Überschreitung der Array-Grenzen vernichtet vermutlich andere globale/statische Variablen.
Ich vermute das genau deswegen das array<String^> keine sauberen Daten lieferte und deshalb die Problematik auftrat...
Könnt Ihr mir Bitte den Gefallen tun und das komplette Thema löschen?
Bitte Bitte Bitte (der Code hat ein Pfad der nicht unbedingt im Web stehen muss...)
-
Hab die Pfade überall geändert... reciht das?
-
Danke dann bin ich wieder beruhigt.
Wenn Sie evtl. in meinem Code Pruefgund noch ändern könnten wäre ich überglücklich.
Vielen Dank nochmal für eure unterstützung...
-
Wenn Du Dich das nächste Mal anmeldest, dann kannst Du das alles selber ändern
-
Hut ab...
Ihr seit echt fit...ich werde das nächste mal dran denken,