FileDialog + CStdioFile - Problem
-
hi leutz,
ich hab mir nen FileDialog gebastelt, der wunderbar funktioniert:
static char BASED_CODE szFilter[] = "|Alle Dateien (*.*)|*.*||"; CFileDialog m_FileDialog(true,0,0,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,szFilter,0,0); m_FileDialog.DoModal();
und ich hab nen netten kleinen Algorythmus um eine Datei zeilenweise aus zu lesen, der auch funktioniert:
m_Dateipfad=strDateipfad; CStdioFile file (strDateipfad, CFile::typeText); CString line; while (file.ReadString (line)) { m_Inhalt.Add(line); } file.Close();
usw...
Doch nun kommt folgendes Problem:
wenn ich den File Dialog benutze und danach CStdioFile benutzen will kommt die Fehlermeldung: "Datei.htm enthält eine ungültige Pfadangabe"
Das passiert nur wenn der FileDialog nicht abgebrochen wurde.Ich habe mehrere CStdioFile-Abfragen , die alle scheitern nach dem Filedialog.
Was habe ich falsch gemacht, oder muss ich den Filedialog noch irgendwie abschließen???
Danke im Vorraus!
-
Dann poste mal den Code der nicht geht und nicht den Code der funktioniert.
SChaue dir aber vorher die Memberfunktionen der Klasse CFileDialog an. Da findest du wie man den Pfad mit der Datei abfragen kann.
Diese Datei solltest du dann öffnen.
Weiters solltest du beim FileDlg checken ob nicht auf abbrechen geklickt wurde sonst versuchst du eine Datei zu öffnen obwohl du keine ausgewählt hast.
-
das problem ist nicht das Benutzen des FileDialogs das funktioniert wunderbar und auch Dateien zeilenweise auslesen funzt! Wenn ich aber den Filedialog benutze und DANACH das zeilenweise Auslesen kommt die Fehlermeldung...
PS: in dem Beispiel habe ich nicht mal auf das Ergebnis des Filedialog zugegriffen sondern ihn nur erzeugt - wird jetzt die OK-Taste gedrückt kommt das Problem
-
Ließt Du eigentlich wenn dir andere was schreiben?
Wenn du das mal machst was ich geschreiben habe sind wir schon ein Stück weiter.
Der FileDlg liefert dir eine Pfad mit Dateinamen zurück. Diesen musst du den File-Funktionen übergeben.
Du hast bis jetzt noch nicht gezeigt das du dies auch machst
-
Nein du verstehst das Falsch,
der FileDialog hat bei meiner Anwendung nichts mit der Zeilenweisen auslesung zu tun.
Das bedeutet, dass ich auf der einen Seite NUR den Filedialog benutze und auf der anderen NUR das Zeilenweise auslesen. Beides Funktioniert unabhängig von einander. Deshalb bin ich auch so verwirrt, dass der Filedialog auf mein CStdioFile einwirkt, denn beides hat nichts miteinander zu tun.Meine Anwendung ist sehr Komplex und ich benutze CStioFile mehr mal in verschiedenen Bereichen und wenn ich einmal den FileDialog benutze funktioniert CFileDialog nicht mehr, der aber ohne FileDialog immer gefunzt hat.
-
Um meine Frage nach einem Tag warten,suchen und verzweifeln selber zu beantworten schreibe ich diesen Beitrag um vielleicht auch anderen zu helfen.
Will man als MFC-Programmierer eine Datei öffnen die relativ zur Anwendungs-EXE steht kann man ja normalerweise einfach
CStdioFile file ("hallo/Test/Links.cfg", CFile::typeText);
verwenden
Wenn man aber den CFileDialog benutz ändert sich der relative Pfad auf einmal, dass bedeuted hallo/Test/Links.cfg ist jetzt nicht mehr der Pfad, der nach der exe folgt sondern der Pfad der in der neu geöffneten Datei steht:
c://hallo/anwendung.exe
mit "hallo/Test/Links.cfg" : c://hallo/hallo/Test/Links.cfgc://test/datei.txt -> wird geöffnet
mit "hallo/Test/Links.cfg" : c://test/hallo/Test/Links.cfgund so passiert es, dass die Datei nicht mehr existiert.
Dieses Problem kann man aber nicht mit dieser Funktion umgehen:
char strDir[1024]; GetCurrentDirectory(1024,strDir);
denn da kommt der gleiche Pfad, in der die geöffnete Datei steht
Lösung:
Bevor man den FileDialog benutz holt man sich den Dateipfad mit GetCurrentDirectory und wenn man fertig ist mit dem FileDialog benutz man SetCurrentDirectory und alle Pfadangaben stimmen wieder:char strDir[1024]; GetCurrentDirectory(1024,strDir); //FileDialog static char BASED_CODE szFilter[] = "|Alle Dateien (*.*)|*.*||"; CFileDialog m_FileDialog(true,0,0,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,szFilter,0,0); if( m_FileDialog.DoModal()==IDOK ) { } //FileDialog Ende SetCurrentDirectory(strDir);
ich hoffe ich konnte auch anderen leid geplagten seelen helfen, die genauso wie ich fast verzweifelt sind.