c# - 这真的是 WPF 的 SaveFileDialog.FileName 中需要的行为吗?

标签 c# wpf system.io.file

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

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

C:\Looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo

创建一个 WindowsForms 项目和一个带有点击事件的窗体按钮:

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);
        }
    }
}

启动程序,移动到保存文件对话框中的长文件夹,输入足够长的名称,如“MyLittleTextFile.txt”,然后按回车。

sFile.FileName 将抛出一个内部异常,因此 Debug.Print 将不会被执行。

现在在 MainWindow 上创建一个 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);
        }
    }
}

再次启动程序,移至保存文件对话框中的长文件夹,输入足够长的名称,如“MyLittleTextFile.txt”,然后按回车。

sFile.FileName 现在仍会抛出内部异常,但它只会返回“Test.txt”的旧值。

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

最佳答案

这是针对 FW 4.7 的 Windows 10 (17134.285)。

输入长文件名时...

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

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

sFile.SafeFileName将仅包含文件名。

MyLittleTextFile.txt

enter image description here

对于 WinForms,我无法强制对话框接受长文件名,只能留下较短的文件名或作为选项取消。

没有抛出异常。

关于c# - 这真的是 WPF 的 SaveFileDialog.FileName 中需要的行为吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52409417/

相关文章:

c# - 将文件从一个目录复制到另一个目录的最快方法

c# - 登录时向浏览器中所有打开的客户端发送消息

c# - 如果我缩放图片 WPF,AdornerLayer 会超出 Border

c# - 在 WPF 中使用附加属性

c# - WPF - 从 UserControl ViewModel 引发事件

c# - 哪些文件类型可以使用 System.IO.File.ReadAllLines()

c# - 如何在 C# Windows 中获取文件大小、文件名、文件扩展名?

c# - 存储库是否应该在 Entity Framework 1.0 中使用相同的上下文实例

wpf - 绑定(bind)到带有可点击链接的列表框

c# - .NET 4.5 File.Copy 可以,但文件不存在