我正在使用 SaveFileDialog 并且必须在 FileName 中设置长字符串(longFileName)。String longFileName 在运行时是已知的。
如果我设置
saveFileDialog.FileName = longFileName ;
然后我明白了System.IO.PathTooLongException
。
我该怎么做?
我正在使用 SaveFileDialog 并且必须在 FileName 中设置长字符串(longFileName)。String longFileName 在运行时是已知的。
如果我设置
saveFileDialog.FileName = longFileName ;
然后我明白了System.IO.PathTooLongException
。
我该怎么做?
简而言之,你不能;NTFS 的最大文件名大小为 256。
我的建议是缩短您的文件名。
尽管文件名可以超过 260 个字符,但使用 API 时可能会遇到一些奇怪的问题。此外,.net 不直接支持它。
如果您想了解更多信息,这里是 BCL 团队博客上关于该问题的三篇文章中的第一篇的链接:http: //blogs.msdn.com/bclteam/archive/2007/02/13/long-paths-in -net-part-1-of-3-kim-hamilton.aspx
答案在于以下几点:
问:文件名的最大字符数是多少?
答:这取决于文件是在 FAT 还是 NTFS 分区上创建的。NTFS 分区上的最大文件名长度为 256 个字符,而 FAT 上的最大文件名长度为 11 个字符(8 个字符名称,. ,3 个字符扩展名)。NTFS 文件名保持大小写,而 FAT 文件名没有大小写概念(但是在 NTFS 上执行搜索等时会忽略大小写)。新的 VFAT 也有 256 个字符的文件名。
基本上,操作系统决定了最大文件大小,而不是您的应用程序。如果将来发布一个支持更多字符的更好的文件系统,您总是可以通过允许它来使您的软件向前兼容,并让用户知道路径何时过长。但是,随着当前技术的进步,您不能使用大于 256 个字符的文件名。
您可以使用以下方法尝试文件名的短路径版本:
[DllImport("kernel32.dll", CharSet = CharSet.Auto)]
public static extern int GetShortPathName(
[MarshalAs(UnmanagedType.LPTStr)] System.String path,
[MarshalAs(UnmanagedType.LPTStr)] System.Text.StringBuilder shortPath,
System.Int32 shortPathLength);
然后保存文件对话框将如下所示:
string long_path = @"C:\Program Files\Microsoft Visual Studio 8\Common7\Packages\Debugger\1033\vsdebugui.dll";
StringBuilder s = new StringBuilder(long_path.Length);
int short_path_length = GetShortPathName(long_path, s, long_path.Length);
string short_path = s.ToString();
SaveFileDialog save_d = new SaveFileDialog();
save_d.FileName = short_path;
save_d.ShowDialog();
你不能。
请记住,Windows 中的路径必须少于 256 个字符。(除非你使用特殊技巧)
为什么你首先想要这么长的文件名?
正如其他人所提到的,没有绕过这个限制的好方法。但是问题不在于 NTFS,它在Win32中。如果你真的想使用 SFU,你可以创建一些非常长的路径,但它使与本机 Win32 东西的互操作变得有趣。
您可能想尝试在路径前加上 \\?\。不过,我从未尝试过使用 .NET。
添加\\?\
到路径的开头。所以D:\<very_long_path>
会变成\\?\D:\<very_long_path>
. 请参阅http://msdn.microsoft.com/en-us/library/aa365247.aspx中的“最大路径长度限制”以供参考