C# Savefiledialog锁定文件,更改文件名

C# Savefiledialog锁定文件,更改文件名,c#,C#,如何在写入其他程序正在使用的文件时保持savefilediallog打开,以便更改文件名并再次尝试保存 private void button1_Click_2(object sender, EventArgs e) { Cursor.Current = Cursors.WaitCursor; CsvExport = Class_ExportData.DataTableToCSV(datatabelControle, csvSCheidingteken); Cursor.

如何在写入其他程序正在使用的文件时保持savefilediallog打开,以便更改文件名并再次尝试保存

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 ???
    }
}

试试这个。将与打开
saveFileDialog1
相关联的代码移到自己的函数中,然后从
按钮1\u单击

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
,但这不太可能。

可能会对您有所帮助。您不应该这样做。你可以让你的用户进入一个循环,唯一的出路是取消或选择一个不同的名称,如果不创建大量的鼠标点击,有效地提醒他们这一点可能会变得相当麻烦……建立的用户体验模式是首先向用户提供反馈,文件被锁定以供写入(理想情况下:由谁/哪个流程)。该消息将提供取消或重试的选项,在重试时,您将再次打开savefiledialog。如果重复使用同一实例,它将保留上次选择的路径和文件名,因此对用户来说不会太麻烦。询问用户是否要强制关闭文件?然后获取文件对象并为他们关闭。请考虑一下…可能不是个好主意。