2017-02-14 2 views
0

Wie wird die savefilediallog-Datei geöffnet, wenn Sie in eine Datei schreiben, die von einem anderen Programm verwendet wird, damit Sie den Dateinamen ändern und erneut speichern können?Datei speichern, Dateiname ändern

private void button1_Click_2(object sender, EventArgs e) 
{ 
    Cursor.Current = Cursors.WaitCursor; 
    CsvExport = Class_ExportData.DataTableToCSV(datatabelControle, csvSCheidingteken); 
    Cursor.Current = Cursors.Default; 

    saveFileDialog1.OverwritePrompt = true; 

    saveFileDialog1.Filter = "Komma gescheiden waarden (*.csv)|*.csv|Tekst bestanden (*.txt)|*.txt|Alle formaten (*.*)|*.*"; 
    saveFileDialog1.DefaultExt = "csv"; 
    saveFileDialog1.AddExtension = true; 
    saveFileDialog1.ShowDialog(); 
} 

private void saveFileDialog1_FileOk(object sender, CancelEventArgs e) 
{ 
    try 
    { 
     string name = saveFileDialog1.FileName; // Get file name.   
     File.WriteAllText(name, CsvExport);  // Write to the file name selected. 
    } 
    catch (Exception ex) 
    { 
     //file is locked, how to get back to the open save file dialog ??? 
    } 
} 
+0

Vielleicht kann [this] (http://stackoverflow.com/questions/3846646/exception-in-opening-a-file-that-is_ready-open) Ihnen helfen. –

+0

Das sollten Sie nicht tun. Sie könnten Ihren Benutzer in eine Schleife versetzen, wo der einzige Ausweg ist, einen anderen Namen abzubrechen oder auszuwählen, und es könnte ziemlich umständlich werden, sie effizient darauf hinzuweisen, ohne viele Mausklicks zu erzeugen ... –

+2

das etablierte UX-Muster dafür wäre, dem Benutzer zuerst eine Rückmeldung zu geben, dass die Datei zum Schreiben gesperrt ist (idealerweise: von wem/welchem ​​Prozess). Diese Nachricht würde Optionen zum Abbrechen oder Wiederholen bereitstellen, und bei einem erneuten Versuch würden Sie den Sicherungsdateidialog erneut öffnen. Wenn Sie dieselbe Instanz wiederverwenden, behält sie den zuletzt ausgewählten Pfad und Dateinamen bei, sodass der Benutzer weniger Probleme hat. – dlatikay

Antwort

1

Versuchen Sie dies. Verschieben Sie den Code im Zusammenhang mit den saveFileDialog1 in seine eigene Funktion zu öffnen, und rufen Sie diese Funktion aus button1_Click:

private void button1_Click_2(object sender, EventArgs e) 
{ 
    Cursor.Current = Cursors.WaitCursor; 
    CsvExport = Class_ExportData.DataTableToCSV(datatabelControle, csvSCheidingteken); 
    Cursor.Current = Cursors.Default; 

    ShowSaveFileDialog(); 
} 

private void ShowSaveFileDialog() 
{ 
    saveFileDialog1.OverwritePrompt = true; 

    saveFileDialog1.Filter = "Komma gescheiden waarden (*.csv)|*.csv|Tekst bestanden (*.txt)|*.txt|Alle formaten (*.*)|*.*"; 
    saveFileDialog1.DefaultExt = "csv"; 
    saveFileDialog1.AddExtension = true; 
    saveFileDialog1.ShowDialog(); 
} 

EDIT: Bei näherer Betrachtung, ich glaube nicht, Sie wollen/müssen die Schleife hier, also habe ich entfernt es. Sie wollen immer noch die ShowSaveFileDialog Methode hier im Fall von Ausnahmen berufen, obwohl:

private void saveFileDialog1_FileOk(object sender, CancelEventArgs e) 
{ 
    try 
    { 
     string name = saveFileDialog1.FileName; // Get file name.   
     File.WriteAllText(name, CsvExport);  // Write to the file name selected. 
     return; 
    } 
    catch (Exception ex) 
    { 
     //file is locked, how to get back to the open save file dialog ??? 
     // maybe display an error message here so that the user knows why they're about to see the dialog again. 
    } 
    ShowSaveFileDialog(); 
} 

Technisch ist dies wahrscheinlich zu einem StackOverflowException führen kann, wenn der Benutzer wiederholt versucht (und ich meine tausende Male) nach dem Speichern erneut zu versuchen eine Ausnahme, aber das ist ziemlich unwahrscheinlich.

Verwandte Themen