在 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 扩展的主要内容,如果未能解决你的问题,请参考以下文章

将项目添加到哈希意外?

在 heroku 上部署 MERN 会导致意外错误

意外的双重函数调用[重复]

Amazon Device Farm 上出现意外的 KIF 测试流程

安装软件包后Gatsby上的意外字符'@'(1:0)

iphone 6 plus 上自动布局的意外结果