SaveDialog1, speichern verhindern, wenn der Dateiname bereits geöffnet ist
-
Hi,
ich habe einen Standard Speichern unter Dialog der jedoch kollidiert, wenn ich
eine Datei (z.B. Test.csv) bereits geöffnet hab,
und die Gleiche datei über meinen Speichern unter Dialog überschreiben will,...
Wie kann ich sowas abfangen??void __fastcall TfrmMain::btnSaveClick(TObject *Sender) { SaveDialog1->FileName = FileName; SaveDialog1->InitialDir = ExtractFilePath(Application->ExeName); if (SaveDialog1->Execute()) { TStringList * List = new TStringList(); List->Add("Ausfahren"); List->Add(" "); List->Add("Einfahren"); //... List->SaveToFile(SaveDialog1->FileName); delete List; FileName = SaveDialog1->FileName; } }
Danke und Gruß
mx
-
Hallo
Die Funktion FileExists verwenden?
bis bald
akari
-
Danke für die schnelle Antwort,
aber das ist nicht genau das was ich suche,...
Ich will nicht prüfen ob eine Datei existiert, sondern ob diese offen ist oder nicht,...
Wenn diese offen ist soll dann das speichern abgebrochen werden, somit
stürzt das prog nicht mehr ab...Gruß
-
Hallo
Dann zuerst mit FileExists schauen ob die Datei schon existiert, wenn ja, dann mit DeleteFile die Datei löschen. Kann die vorhandene Datei nicht gelöscht werden, dann wirst du wohl auch keine Schreibrechte mit TStringList bekommen.
Alternativ must du mit std::fstream arbeiten da kannst du zuerst überprüfen ob du Schreibrechte bekommst.
Oder du arbeitest mit try-catch, um die Exception bei SaveToFile abzufangen und entsprechend manuell zu behandeln.
bis bald
akari
-
Pack doch einfach einen try/catch-Block um SaveToFile und fang die Exception ab. Dann kannst du ja eine meldung rausgeben, dass das Schreiben jetzt nicht möglich ist.
-
Hi, danke,...
ich hab das mit dem Try/catch ausprobiert, aber der stürzt immer noch ab, und führt meine Fehlermeldung nicht aus, was hab ich hier falsch??
void __fastcall TfrmMain::btnSaveClick(TObject *Sender) { SaveDialog1->FileName = FileName; SaveDialog1->InitialDir = ExtractFilePath(Application->ExeName); if (SaveDialog1->Execute()) { TStringList * List = new TStringList(); List->Add("Ausfahren"); List->Add(" "); List->Add("Einfahren"); try { List->SaveToFile(SaveDialog1->FileName); } catch(EFOpenError&) { MessageDlg("Die Datei kann nicht gespeichert werden, da eine gleichnahmige Datei bereits geöffnet ist", mtInformation, TMsgDlgButtons() << mbOK , 0 ); delete List; return; } delete List; //RichEdit1->Lines->SaveToFile(SaveDialog1->FileName); FileName = SaveDialog1->FileName; //StatusBar1->Panels->Items[0]->Text = FileName; } }
Gruß mx
-
sicher, dass es EFOpenError ist? Alternativ kannst du es mit catch(...) probieren, um alle Fehler abzufangen.
greetz KN4CK3R
-
Hallo
Die Exception wird im Builder normalerweise immer angezeigt, auch wenn im Programm eine try-catch-behandlung eingebaut ist (die danach ausgeführt wird). Teste dein Programm mal ohne IDE, dnan wirst du nur deine Behandlung sehen.
bis bald
akari
-
Beide Tipps sind die lösung
das ... hatte ich schon ausprobiert allerdings kommt wieder ein Compilerfehler,...
Wenn ich die .exe allerdings ohne Boarland ausführe gehts einwandfrei,...Vielen Dank,...
gruß
mx
-
KN4CK3R schrieb:
sicher, dass es EFOpenError ist?
Wahrscheinlich eher EFCreateError.