MFC (Visual C++ 6.0): String als *.txt Datei speichern

mstangl

Grünschnabel
Hallo!
Ich stehe bei der Programmierung eines MFC - Programms (SDI) mit Visual C++ 6.0 vor zwei Problemen bei denen ich ohne Hilfe einfach nicht weiterkomme.
In meinem Programm soll eine CString-Variable gespeichert werden (es soll eine einfache Textdatei *.txt angelegt werden). Das Speichern selbst funktioniert mit dem unten eingefügten Code einwandfrei, nur habe ich nun 2 Probleme die ich scheinbar nicht lösen kann...

Code:
// Dialog zum Speichern einer Datei
CFileDialog fileDlg(FALSE, ".txt", NULL, 0, "Textfile (*.txt)|*.txt|All Files (*.*)|*.*||");
 
fileDlg.DoModal();
 
CString pfad = fileDlg.GetPathName ();
 
CFile datei;
 
// Dies ist der String der gepeichert wird
CString speicherString = "ABC";
 
// Variable fuer die Dateilaenge erzeugen
long int dateilaenge = speicherString.GetLength ();
 
// Oeffnen der Datei zum Schreiben
datei.Open (fileDlg.GetPathName(), CFile::modeCreate | CFile::modeWrite);
 
// Inhalt des Strings in Datei schreiben
datei.Write (speicherString, dateilaenge);
 
// Schliessen der Datei
datei.Close ();

- Wenn im "Speichern unter"-Dialog eine vorhandene Textdatei überschrieben werden soll, welche allerdings SCHREIBGESCHÜTZT ist, liefert das Programm eine Fehlermeldung (Debug Assertion Failed...) und stürzt anschließend ab. Wie kann ich dies verhindern?

- Und ausserdem würde ich gerne realisieren, dass die Textdateien die mein Programm durch den obigen Code anlegt SCHREIBGESCHÜTZT SIND. Wie kann ich dies erreichen?

Ich wäre für Hilfe sehr dankbar, muss jedoch erwähnen dass ich kein erfahrener Programmierer bin und deshalb eher "grobe Beschreibungen und Erklärungen" manchmal nicht wirklich verstehen kann.
 
schreibschutz setzten:
Code:
::SetFileAttributes(PfadundDateiname, FILE_ATTRIBUTE_READONLY);
das passende Gegenstück ist natürlich!
Code:
::SetFileAttributes(PfadundDateiname, FILE_ATTRIBUTE_NORMAL);

Du kannst mit
Code:
DWORD  = Test;
Test = GetFileAttributes(PfadundDateiname);
herausfinden ob die Datei einen Schreibschutz hat!
Ein dementsprechendes Abfangen sollte damit nicht mehr das Problem sein!

Sven
 
Open liefert dir zurück, ob es erfolgreich verlaufen ist.
Wenn beim Open ein Fehler aufgetreten ist, darfst du nicht in das CFile Objekt schreiben.

Und Write wirft eine Exception, bei Auftreten eines Fehlers. Wenn du die Exception nicht abfängst, schlägt sie ganz oben auf, was zu einem Abbruch führt.

also
Code:
TRY
{
datei.Write (speicherString, dateilaenge);
}
CATCH ( CFileException e )
{
// hier kannst du irgendwas tun, z.B. einen Fehlerstatus setzen oder definiert die Funktion verlassen ...
}

Close kann übrigens auch eine Excepton auslösen.
 
Zuletzt bearbeitet:
Übrigens kannst du auch mit CFile::SetStatus den ReadOnly Status setzen
Und mit GetStatus dir das entsprechend holen.
 

Neue Beiträge

Zurück