USB Stick entfernen und SaveDialog
-
Hallo,
habe ein Problem, wen ich mit mein Programm auf den USB Stick schreibe, kann ich ihn nicht mehr entfernen. Es geht nur wen ich das Programm schließen.
Aber das sollte nicht so sein da es ein Editor ist.-Habe schon versucht mit Free() aber das sollte man nicht machen
-Habe auch schon dann den Laufwerksbuchstaben geändertIch weiß nicht mehr weiter ich hoffe es kann mir einer Helfen
-
Rave173 schrieb:
[...] wen[n] ich mit mein Programm auf den USB Stick schreibe [...]
Bitte den entsprechenden Code-Ausschnitt zeigen.
-
Sorry hier ist der Code
void __fastcall TMainForm::Exportieren1Execute(TObject *Sender) { TMDIChild *Child = static_cast<TMDIChild*>(ActiveMDIChild); SaveDialog1->Title = "Exportieren"; AnsiString sProgrammNr; AnsiString sMaschine; TStringList *worte = new TStringList(); split(worte,Child->sFile,'\\'); if (worte->Count > 2) { sProgrammNr = worte->Strings[worte->Count-1]; sMaschine = worte->Strings[worte->Count-3]; worte->Clear(); if (sMaschine.AnsiPos(".BER") != 0) { split(worte,sMaschine,'.'); sMaschine = worte->Strings[worte->Count-2]; worte->Clear(); } else { sMaschine = NULL; } if (sProgrammNr.AnsiPos(".") != 0) { split(worte,sProgrammNr,'.'); sProgrammNr = worte->Strings[worte->Count-2]; worte->Clear(); } else { sProgrammNr = NULL; } if (WYUpper == sMaschine) { SaveDialog1->Filter = "WY UPPER (O" + sProgrammNr + ")|O" + sProgrammNr; SaveDialog1->FileName = "O" + sProgrammNr; } else if (WYLower == sMaschine) { SaveDialog1->Filter = "WY LOWER (O" + sProgrammNr + ".P-2)|O" + sProgrammNr + ".P-2"; SaveDialog1->FileName = "O" + sProgrammNr + ".P-2"; } else { SaveDialog1->Filter = FilterDialog; SaveDialog1->FileName = ""; } SaveDialog1->FilterIndex = 1; SaveDialog1->InitialDir = USBLW + ":\\"; if (SaveDialog1->Execute()) { ofstream f(SaveDialog1->FileName.c_str()); if (f) { int iCount = Child->RichEdit1->Lines->Count; for (int i=0; i<iCount; i++) { AnsiString z = Child->RichEdit1->Lines->Strings[i].Trim(); f<<z.c_str()<<endl; } f.flush(); f.close(); } } } else { MessageDlg(L"'Fehler' es ist kein Bereich vorhanden!", mtError, TMsgDlgButtons() << mbOK, 0); } delete worte; } //---------------------------------------------------------------------------
-
Nimm KEINEN TSaveDialog auf der Form.
Erzeuge ein TSaveDialog- Objekt innerjhalb Deiner Funktion und LÖSCHE diesen am Ende der Funktion wieder.
Gruss
Frank
-
@Rave173
Merk dir vor dem Aufmachen des Dialogs das "Current Directory" (GetCurrentDirectory), und setz das Current Directory nach dem schliessen des Dialogs wieder auf den alten Wert zurück (SetCurrentDirectory).Ich kenn mich zwar mit VLC nicht aus, aber wenn der VLC Save-File Dialog gleich arbeitet wie der originale von Windows (oder VLC den originalen von Windows sogar intern verwendet), dann setzt dieser das "current directory" auf das Verzeichnis des gewählten Pfades.
Und Windows lässt dich einen Datenträger nicht "sicher entfernen", so lange es noch Prozesse gibt die ihr Current Directory auf dem Datenträger haben. (Du kannst auch das Verzeichnis nicht löschen, Explorer meldet dann dass es von einem anderen Programm verwendet wird -- was ja im Prinzip auch so ist. Man kann dem Programm ja nicht gut das Current Directory unterm Hintern weglöschen.)