C#保存文件对话框

5

我正在使用 SaveFileDialog 来保存文件。现在我需要检查文件名是否已经存在。

如果存在,用户需要有机会更改名称或覆盖已经存在的文件。

我已经尝试了各种方式并进行了大量搜索,但是在技术上认为应该很容易做到,但是找不到解决方案。在 if (File.Exists(Convert.ToString(infor)) == true) 中,必须执行检查。

SaveFileDialog sfd = new SaveFileDialog();
sfd.Filter = ".xlsx Files (*.xlsx)|*.xlsx";
if (sfd.ShowDialog() == DialogResult.OK)
{
    string path = Path.GetDirectoryName(sfd.FileName);
    string filename = Path.GetFileNameWithoutExtension(sfd.FileName);

    for (int i = 0; i < toSave.Count; i++)
    {
        FileInfo infor = new FileInfo(path + @"\" + filename + "_" + exportlist[i].name + ".xlsx");
        if (File.Exists(Convert.ToString(infor)) == true)
        {

        }
        toSave[i].SaveAs(infor);
        MessageBox.Show("Succesvol opgeslagen als: " + infor);
    }
}

3
在if语句中,为什么不直接写成:if(infor.Exists)……?我知道这并没有回答你的问题,只是对代码的一点观察。 - LexyStardust
同时 == true 是多余的。 - Chris Dunaway
3个回答

6

只需使用 SaveFileDialogOverwritePrompt 属性:

SaveFileDialog sfd = new SaveFileDialog{ Filter = ".xlsx Files (*.xlsx)|*.xlsx",
                                         OverwritePrompt = true };

在这里可以找到有关OverwritePrompt的MSDN链接:此处


1
谢谢您的覆盖,但现在用户没有机会选择填写另一个名称或覆盖。 - EfhK
1
点击覆盖提示框中的“否”应该只是回到对话框并重试。 - Corey Adler
请注意,@roryap的答案中提到了一种竞态条件,可能会导致用户选择了不存在的文件,但当您的代码尝试写入时,文件已经存在。 - eFloh

4

改为这样做

SaveFileDialog sfd = new SaveFileDialog();
sfd.Filter = ".xlsx Files (*.xlsx)|*.xlsx";
sfd.OverwritePrompt = true;

这应该能为您解决问题。


我从中创建了这个,但没有收到文件将被覆盖的消息。 - EfhK

1
我会采用这样的方法:
SaveFileDialog sfd = new SaveFileDialog();
sfd.Filter = ".xlsx Files (*.xlsx)|*.xlsx";

do
{
    if (sfd.ShowDialog() == DialogResult.OK)
    {
        string path = Path.GetDirectoryName(sfd.FileName);
        string filename = Path.GetFileNameWithoutExtension(sfd.FileName);

        try
        {
            toSave[i].SaveAs(infor);
            break;
        }
        catch (System.IO.IOException)
        {
            //inform user file exists or that there was another issue saving to that file name and that they'll need to pick another one.
        }
    }
} while (true);

MessageBox.Show("Succesvol opgeslagen als: " + infor);

捕获异常而不是使用File.Exists确实是唯一的方法,因为在File.Exists和实际写入文件之间,某些外部因素可能会创建该文件,从而抛出异常,您必须处理它。
此代码将循环并继续提示用户,直到成功写入文件。

提到File.Exists和实际尝试写入文件之间的竞态条件是一个很好的观点。解决这个问题的唯一方法就是尝试打开文件。这甚至不是设计上的问题,而是算法理论上的问题 :) - eFloh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接