代码之家  ›  专栏  ›  技术社区  ›  Thern

这是SaveFileDialog中真正需要的行为。WPF的文件名?

  •  2
  • Thern  · 技术社区  · 8 年前

    在使用SaveFileDialog时,我注意到当路径太长时,WPF和WindowsForms之间的行为存在差异。

    要验证这一点,请创建一个长文件夹名(但不能超过允许的247个字符),例如:

    C:\oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo

    创建一个Windows窗体项目,并在窗体上创建一个带有单击事件的按钮:

    using System;
    using System.Diagnostics;
    using System.Windows.Forms;
    
    namespace WindowsFormsApplication1
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                SaveFileDialog sFile = new SaveFileDialog();
                sFile.FileName = "Test.txt";
                if (sFile.ShowDialog() == DialogResult.Yes)
                    Debug.Print(sFile.FileName);
            }
        }
    }
    

    启动程序,移动到SaveFileDialog中的long文件夹,输入足够长的名称,如“MyLittleTextFile.txt”,然后按enter键。

    斯菲尔。文件名将引发内部异常,从而进行调试。不会执行打印。

    现在,在主窗口上创建一个WPF项目和一个带有单击事件的按钮:

    using System.Diagnostics;
    using System.Windows;
    using Microsoft.Win32;
    
    namespace WpfApplication1
    {
        public partial class MainWindow : Window
        {
            public MainWindow()
            {
                InitializeComponent();
            }
    
            private void button_Click(object sender, RoutedEventArgs e)
            {
                SaveFileDialog sFile = new SaveFileDialog();
                sFile.FileName = "Test.txt";
                if (sFile.ShowDialog() == true)
                    Debug.Print(sFile.FileName);
            }
        }
    }
    

    再次启动程序,移动到SaveFileDialog中的long文件夹,输入足够长的名称,如“MyLittleTextFile.txt”,然后按enter键。

    斯菲尔。FileName现在仍然会抛出一个内部异常,但它只会返回到旧值“Test.txt”。

    这充其量是令人惊讶的,因为在这一点上,我当然希望值是我选择的值——或者在尝试使用它时出错。在我看来,拥有旧价值没有多大意义。有人知道为什么要这么做吗?这是期望的行为,还是一个bug?

    1 回复  |  直到 8 年前
        1
  •  0
  •   fourwhey    8 年前

    这是在针对FW 4.7的Windows 10(17134.285)上实现的。

    输入长文件名时。。。

    sFile.FileName 将包含完整的UNC路径。(见下文)

    \\?\C:\LooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooongFolder\MyLittleTextFile.txt

    sFile.SafeFileName 将只包含文件名。

    MyLittleTextFile.txt

    enter image description here

    使用WinForms时,我无法强制对话框接受长文件名,只能选择较短的文件名或取消。

    没有抛出异常。