Exisitierende Datei ermitteln????
-
Man kann dieselbe Datei nicht zweimal nacheinander öffnen.
Wenn du in die Datei was schreiben willst, ohne sie zu lesen, dann öffne sie mit CFile::modeWrite, wenn sie du dabei auch lesen willst, dann mit CFile::modeReadWrite.
Wenn du in eine nur zum Lesen geöffnete Datei schreiben willst, dann schliesse sie und öffne zum Schreiben
-
Vielleicht erst öffnen versuchen, und wenn nicht neu erstellen.
CStdioFile file; CString filename,txt; filename="date.txt"; if(file.Open(filename, CFile::modeRead)) { //wenn geöffnet dann.... file.Close(); } else { //wenn nicht vorhanden... if (file.Open(filename, CFile::modeCreate | CFile::modeWrite)) { file.Write(#####); //oder txt="BlaBlaBla"; file.WriteString(txt); } }
[ Dieser Beitrag wurde am 21.06.2002 um 21:19 Uhr von hronny editiert. ]
-
Danke hronny dein Code funzt.
-
Aber auch nicht die Lösung für das Problem, ob die Datei schon existiert.
Angenommen die Datei ist zum Zeitpunkt des Prüfens exklusive geöffnet. Dann kann sie nicht geöffnet werden, das Programm denkt: "Aha, nicht vorhanden." Und beim Erstellen gibt es dann den Crash -> doppelte Dateinamen in einem Verzeichnis
Aber auch wenn sie nicht exklusiv geöffnet ist: Ein Programm schreibt gerade in die Datei und du schließt die Datei einfach...
-
Genau das ist es.
Da stehe ich jetzt an.
Bei meinem Programm ist ein Mathematik - Programm bei dem man einen Benutzernamen eingegeben muss und man kann dann seine Zeit (in der man die Rechnungen gelöst hat) abspeichern.Jetzt möchte ich, das wenn man in das Dialogfeld geht in dem man abspeichert die letzte Abgespeicherete Zeit anzeigt. Das Wäre ja kein problem aber ich möchte das wenn man das erste mal Abspeichert "Erste Abspeicherung" (oder so ähnlich) dort Steht. Ich habe mir das so gedacht, dass das Programm bei der Benutzereingabe prüft, ob es schon eine Datei mit diesem Namen gibt und wenn nicht sie erstellt und das mit erste Benutzung reischreibt. Weis jemand wie das funzt.
Oder hat jemand eine andere Idee, wie ich das machen könnte???[ Dieser Beitrag wurde am 22.06.2002 um 13:01 Uhr von Fink Christoph editiert. ]
-
Hat niemand eine Idee, wie ich das anderst lösen könnte???????????????????????????????
-
Hi!
Erstell einfach eine neue "Allgemeine Klasse". Mach die Klasse SERIALIZEbar. Dann füge einfach Funktionen wie:
# Benutzername
# Zeit
# Anz. speichern
hinzu. Das ganzei speicherst du dann in einem Object Array (dort passen mehrere Einträge hinein).
Bin mir nicht ganz sicher, ob diese Variante deinen Vorstellungen entspricht, aber du hättest dann keine Probleme mit Dateinen mehr, da ja nur mehr eine existiert!*mike*
-
Das entspricht genau meinen Vorstellungen.
Aber könntest du mir das geanauer erklären???
Ich habe noch nie was mit Arrays gemacht und kenne mich deshalb nicht damit aus.
-
Hi!
Probiers mal so:
1. Erstelle folgende Klasse:
# Allgemeine Klasse
# CUser
# Abgeleitet von: CObject public
2. füg folgendes in die Klasse:class CUser : CObject { DECLARE_SERIAL (CUser) public: void SetUserName(CString strUser) {m_strUserName = strUser;} CString GetUserName() {return m_strUserName;} void SetTime (CString strTime) {m_strTime = strTime:} CString GetTime() {return m_strTime;} void SetAnzSave(int iAnz) {m_iAnzSave = iAnz;} int GetAnzSave() {return m_iAnzSave;} private: CString m_strUserName; CString m_strTime; int m_iAnzSave; }
4. Schreib folgendes in User.cpp (z.B. vor dem Konstruktor - nicht in den Konstruktor):
IMPLEMENT_SERIAL (CUser, CObject,1)
3. Füg eine Memberfunktion in CUser ein
# void
# Serialize(CArchive &ar)
# public
# virtual (ist nämlich eine normalerweise eine MFC Funktion)
4. Schreib folgendes in Serialize:void CUser::Serialize(CArchive &ar) { CObject::Serialize(ar); if(ar.IsStoring()) ar<<m_strUserName<<m_strTime<<m_iAnzSave; else ar>>m_strUserName>>m_stTime>>m_iAnzSAve; }
5. Füg die User.h in deine Dlg - Klasse
6. Füge eine Membervariable in deine Dlg Klasse:
# CObArray
# m_aUser
# Privat7. Das wars! Nun musst du nur mehr navigieren können. In einem Dialogfeld schauts ein wenig anders aus wie in einer SDI:
Dialog:
Erster Eintrag:
CUser* pUser = new CUser();
pUser = (CUser*)m_aUser[0];Neuer Eintrag:
CUser* pUser = new CUser();
m_aUser.Add(pUSer);Nun ist der 0 eintrag in pUser. Mit pUser->GetUserName() bekommst du z.B. den Namen.
Schau mal in der MSDN nach den Class Members von CObArray (alles was man braucht!!!)Bei einer SDI schauts so aus:
m_aUser.Serialize(ar); //Speichern und laden - Serialize Funktion nicht einfügen !!!!
Das speichern auf die HD:
CFile file("C:\\user.dat", CFile::modeWrite | CFile::modeCreate); CArchive ar(&file, CArchive::store); Serialize(ar); ar.Close();
Von der HD lesen:
CFile file("C:\\user.dat", CFile::modeRead); CArchive ar(&file, CArchive::load); Serialize(ar); ar.Close();
Uhh. Ich glaub das wars. Hab schon Krämpfe in meinen Fingern
Wenns ncoh Fragen gibt, dann poste einfach nochmals!!
mfg *mike*
-
Hab leider auch keine andere Idee, aber eine weitere Frage, was bedeutet "Exclusiv" bei einer geöffneten Datei?