2017-02-14 143 views
0

如何在写入正在由其他程序使用的文件时保持savefilediallog处于打开状态,以便可以更改文件名并尝试再次保存?Savefiledialog锁定文件,更改文件名

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

也许[this](http://stackoverflow.com/questions/3846646/exception-in-opening-a-file-that-is-already-open)可以帮助你。 –

+0

你不应该那样做。你可以把你的用户放在一个循环中,唯一的出路是取消或选择一个不同的名字,并且在不产生大量鼠标点击的情况下提醒他们有效地提醒他们可能会变得相当麻烦...... –

+2

已建立的UX模式将首先向用户提供反馈,该文件被锁定以便写入(理想情况下:由谁/哪个进程)。该消息将提供取消或重试的选项,重试时您将再次打开savefiledialog。如果您重复使用相同的实例,它将保留上次选择的路径和文件名,以免对用户造成麻烦。 – dlatikay

回答

1

试试这个。从button1_Click移动与开saveFileDialog1到它自己的功能相关的代码,并调用该函数:

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(); 
} 

编辑:在进一步的考虑,我不认为你想/需要这里的循环,所以我删除它。你还是想在这里调用ShowSaveFileDialog方法在异常情况下,虽然:

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(); 
} 

从技术上讲,如果用户试图重复这大概可以导致StackOverflowException(我的意思是上千次),重试后保存一个例外,但这不太可能。