OpenFileDialog 在超过 260 个字符的路径上返回空字符串(或根本不返回)
Posted
技术标签:
【中文标题】OpenFileDialog 在超过 260 个字符的路径上返回空字符串(或根本不返回)【英文标题】:OpenFileDialog returns empty string on paths over 260 characters (or doesn't return at all) 【发布时间】:2020-03-02 22:54:42 【问题描述】:我正在编写一个程序,它需要从系统上的任何位置读取文件。该程序的某些用户的路径超过了 260 个字符的限制。 OpenFileDialog
不适用于路径超过 260 个字符的文件。
我尝试过同时使用System.Windows.Forms.OpenFileDialog
和Microsoft.Win32.OpenFileDialog
。在前者的情况下,当我在导航到并选择文件后单击“打开”时,窗口不会关闭,程序也不会继续。后者的情况下,当我点击“打开”时窗口会关闭,但路径是一个空字符串。
我已更新计算机上的注册表。我已经编辑了应用程序清单文件。我会尝试将“//?/”字符串添加到我的路径中,但没有要添加的路径。
var dialog = new OpenFileDialog
// initialize dialog
if (dialog.ShowDialog() == DialogResult.OK) // DialogResult.OK replaced with true if using Microsoft.Win32.OpenFileDialog
// if when using System.Windows.Forms.OpenFileDialog, I will never get to this point
// if using Microsoft.Win32.OpenFileDialog, I will get here but dialog.FileNames will be empty
如果我更新了注册表和应用程序清单,我希望上面的代码在长路径和短路径上都能正常工作。我怀疑这只是不受支持,但我所有的搜索都显示有人提供的解决方案要么不起作用,要么只在特定情况下起作用。
【问题讨论】:
您的目标是哪个 .net 框架?显然它不应该是 4.6.2 及更高版本的问题。 我的目标是框架 4.7.2。 【参考方案1】:在System.Windows.Forms.OpenFileDialog
的情况下,我可以通过将ValidateNames
设置为false 来解决ShowDialog()
在用户单击“打开”时不返回的问题,
System.Windows.Forms.OpenFileDialog openFileDialog_WindowsForms = new System.Windows.Forms.OpenFileDialog
CheckFileExists = true,
CheckPathExists = true,
ValidateNames = false // this will allow paths over 260 characters
;
if (openFileDialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
string[] fileNames = openFileDialog_WindowsForms.getFileNames_WindowsForms();
foreach (var file in fileNames)
try
Console.WriteLine(File.ReadAllText(file));
catch (Exception ex)
Console.WriteLine("Couldn't open file from Windows.Forms.OpenFileDialog:" + ex.Message);
;
和反射来克服无法从FilePath
或FilePaths
属性访问的路径。事实证明,路径存在于我可以使用反射访问的私有属性中。
public static class OpenFileDialogLongPathExtension
public static string[] getFileNames_WindowsForms(this System.Windows.Forms.OpenFileDialog dialog)
var fileNamesProperty = dialog.GetType().GetProperty("FileNamesInternal", BindingFlags.NonPublic | BindingFlags.Instance);
var fileNamesFromProperty = (string[])fileNamesProperty?.GetValue(dialog);
return fileNamesFromProperty;
我为 Microsoft.Win32.OpenFileDialog
尝试了类似的方法,但私有属性似乎仍然无效,因此相同的解决方案不起作用。
无论如何,我希望这对其他人有所帮助。此示例是使用 .NET Framework 4.8 创建的。
【讨论】:
以上是关于OpenFileDialog 在超过 260 个字符的路径上返回空字符串(或根本不返回)的主要内容,如果未能解决你的问题,请参考以下文章
Composer 安装错误:ZipArchive::extractTo():完整提取路径超过 MAXPATHLEN (260)
如何修复 PHP 警告:file_exists():文件名超过此平台上允许的最大路径长度 (260)?