C# 使用两个扩展名保存文件

C# 使用两个扩展名保存文件,c#,winforms,savefiledialog,C#,Winforms,Savefiledialog,我正在尝试使用SaveFileDialog保存文档。 过滤器应允许用户将文档保存为.doc或.docx,但如果用户选择文件名“Test.txt”,则文件将保存为Test.txt,而不是Test.txt.doc 如何防止文件的类型转换并让用户只保存.doc或.docx文件?如果用户自己没有选择这两个扩展中的一个,它应该始终保存为.doc 我当前的代码如下所示: SaveFileDialog sfd = new SaveFileDialog(); string savepath = ""; sfd.

我正在尝试使用SaveFileDialog保存文档。 过滤器应允许用户将文档保存为.doc或.docx,但如果用户选择文件名“Test.txt”,则文件将保存为Test.txt,而不是Test.txt.doc

如何防止文件的类型转换并让用户只保存.doc或.docx文件?如果用户自己没有选择这两个扩展中的一个,它应该始终保存为.doc

我当前的代码如下所示:

SaveFileDialog sfd = new SaveFileDialog();
string savepath = "";
sfd.Filter = "Wordfile (*.doc;*.docx;)|*.doc;*.docx)";
sfd.DefaultExt = ".doc";
sfd.SupportMultiDottedExtensions = true;
sfd.OverwritePrompt = true;
sfd.AddExtension = true;
sfd.ShowDialog();

//Save the document
doc.SaveAs(sfd.FileName, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing);
我可以做一个if并询问sfd.FileName是否以.doc或.docx结尾,但这有点复杂,并且使SaveFileDialog的过滤器完全可用

当我键入文件名“Test”时,输出将是Test.doc,当我键入“Test.txt”时,输出将是“Test.txt”

编辑:Ilyas的答案有点正确。它可以使用.txt作为扩展名,但当我只是键入'Test'或'Test.doc'作为文件名时就不行了,因为它总是将文件保存为'Test.doc.doc'。 我当前的解决方案:

//.....
sfd.ShowDialog();
if (!sfd.FileName.EndsWith(".doc") && !sfd.FileName.EndsWith(".docx"))
    sfd.FileName += ".doc";
编辑:可以在Ilyas答案或我对Ilyas答案的评论中找到解决方案。

var sfd=new SaveFileDialog();
var sfd = new SaveFileDialog();
sfd.Filter = "Worddatei (*.doc;*.docx;)|*.doc;*.docx)";

Func<string, bool> isGoodExtension = path => new[]{".doc", ".docx"}.Contains(Path.GetExtension(path));

sfd.FileOk += (s, arg) => sfd.FileName += isGoodExtension(sfd.FileName) ? "" : ".doc";

sfd.ShowDialog();

//Save the document
Console.WriteLine (sfd.FileName);
sfd.Filter=“Worddatei(*.doc;*.docx;)|*.doc;*.docx)”; Func isGoodExtension=path=>new[]{.doc“,.docx”}.Contains(path.GetExtension(path)); sfd.FileOk+=(s,arg)=>sfd.FileName+=isGoodExtension(sfd.FileName)?“”:“.doc”; ShowDialog(); //保存文档 Console.WriteLine(sfd.FileName);

如果输入
1.txt
,则打印
1.txt.doc
。请随意提取检查或附加到另一个方法中的逻辑,以便使代码更具可读性

如果您提供“另存为”选项,则用户应该拥有最终控制权,如所提供的那样。如果你想控制他们的计算机和文件那么多,那么就实施检查,但这是傲慢的。@AlexFilipovici谢谢:),但在我看来,如果(…EndsWith(“.doc”)| |…EndsWith(.docx”)这并不是最好的方法。当我保存一个图像并有10种格式时,这将是一个很长的if。无论如何,它是有效的。@GrantThomas当使用“另存为”时,强制一个文件有一个特定的后缀是完全可以接受的。尝试从Word保存一个文件并添加“.txt”作为后缀。它将把它变成“*.txt.docx”@MatthewWatson谁说MS Office做得对?他们也给了any选项。@GrantThomas Word 2010和更高版本没有
any
选项-您必须选择特定的格式。让用户用后缀错误的特定格式保存文件不是很好,因为如果您在资源管理器中双击它它将尝试使用错误的应用程序打开它。我只是使用Word作为一个(常见)示例。出于相同的原因,大多数其他以注册文件后缀格式保存文件的应用程序的工作方式都是相同的。
sfd.FileOk+=(s,arg)=>sfd.FileName+=new[]{“doc,docx”}.ToString().Contains(Path.GetExtension(sfd.FileName))?:“.doc”
工作正常,谢谢!好的,我试过了,它可以使用假扩展名工作,但扩展名不正确。当我键入“Test.txt”时,它会将文件另存为“Test.txt.doc”,但当我只键入“Test”时,它会将文件另存为“Test.doc.doc”。sfd.AddExtension为假,DefaultExt为“”…@Rudi更新了我的答案,抱歉弄错了。我相信它可以工作,但我使用的是.NET Framework 2,不能使用Func。你能给我一个没有Func的解决方案吗?这个解决方案在.NET Framework 3或更早版本下工作。`sfd.FileOk+=(s,arg)=>sfd.FileName+=Path.GetExtension(sfd.FileName).Contains(“.docx”)| | Path.GetExtension(sfd.FileName).Contains(“.doc”)?:“.doc”`谢谢Ilya:)