在 multidotExtension 上意外添加了 SaveFileDialog 扩展
Posted
技术标签:
【中文标题】在 multidotExtension 上意外添加了 SaveFileDialog 扩展【英文标题】:SaveFileDialog extension added unexpectedly on multidotExtension 【发布时间】:2015-06-10 05:20:55 【问题描述】:我的保存文件对话框有问题。在我更改文件对话框中的save as type
之前,保存文件对话框看起来很好。它总是添加已经存在的扩展。我需要多点扩展。
所以,如果我更改save as type
,保存文件对话框将使文件名变为D:\Temp\Test.dt.dt.dt.dt.dt.dt.txt
切换save as type
时如何使文件.dt
不添加
这是一个 Windows 错误吗?我正在使用 winform 和 .net3.5 这是我如何重现它:
public partial class Form1 : Form
public Form1()
InitializeComponent();
private void button1_Click( object sender, EventArgs e )
SaveFileDialog saveFileDialog1 = new SaveFileDialog
Title = "Save list file",
Filter = "Text Files (*.dt.txt)|*.dt.txt|Microsoft Excel Files (*.dt.xls)|*.dt.xls|Microsoft Excel XML Files (*.dt.xlsx)|*.dt.xlsx",
DefaultExt = ".dt.txt",
OverwritePrompt = true,
SupportMultiDottedExtensions = true,
AddExtension = true
;
saveFileDialog1.FileName = "D:\\Temp\\test.dt.txt";
saveFileDialog1.ShowDialog();
【问题讨论】:
我无法重现您的代码的问题。这对我来说可以。如果您只使用 .txt 而不是 .dt.txt 会发生什么?如果不出意外,您可以尝试退出 Visual Studio 并重新进入的旧待机状态,或者重新启动系统并再次重试以查看是否有效。 我可以在 vs2013、winforms、.net 4.5.1、windows 8.1 中重现它 @SteveFerg,您是否尝试过在保存文件对话框打开时更改“另存为类型”?我需要保留多扩展名,因为该软件已经运行了几年,删除它可能会消除向后兼容性. 【参考方案1】:我认为问题出在FileDialog.cs:line877。
它调用string currentExtension = Path.GetExtension(fileName);
来获取所选文件的当前扩展名,这里是Path.GetExtension(fileName);
的代码
// Returns the extension of the given path. The returned value includes the
// period (".") character of the extension except when you have a terminal period when you get String.Empty, such as ".exe" or
// ".cpp". The returned value is null if the given path is
// null or if the given path does not include an extension.
//
[Pure]
public static String GetExtension(String path)
if (path==null)
return null;
CheckInvalidPathChars(path);
int length = path.Length;
for (int i = length; --i >= 0;)
char ch = path[i];
if (ch == '.')
if (i != length - 1)
return path.Substring(i, length - i);
else
return String.Empty;
if (ch == DirectorySeparatorChar || ch == AltDirectorySeparatorChar || ch == VolumeSeparatorChar)
break;
return String.Empty;
不支持多点扩展。所以我认为这是一个错误。
【讨论】:
【参考方案2】:您不能添加双重扩展
文件扩展名应该在文件名中的最后一个.
之后。
说明:
你的分机是.dt.txt
:
在这种情况下,扩展名将是.txt
。它将.dt
作为文件名的一部分(这是重复.dt
的原因)和.txt
作为扩展名。
【讨论】:
基于SupportMultiDottedExtensions,我们可以添加它来支持多点扩展。如果我自己添加扩展名,我可以理解它是否被视为文件名的一部分,但是,如果文件对话框添加“.dt”扩展名,为什么在更改文件类型时不删除它。以上是关于在 multidotExtension 上意外添加了 SaveFileDialog 扩展的主要内容,如果未能解决你的问题,请参考以下文章