1

我正在使用 SaveFileDialog 并且必须在 FileName 中设置长字符串(longFileName)。String longFileName 在运行时是已知的。

如果我设置

saveFileDialog.FileName = longFileName ;

然后我明白了System.IO.PathTooLongException

我该怎么做?

4

7 回答 7

5

简而言之,你不能;NTFS 的最大文件名大小为 256。

我的建议是缩短您的文件名。

于 2009-12-01T15:03:29.573 回答
4

尽管文件名可以超过 260 个字符,但使用 API 时可能会遇到一些奇怪的问题。此外,.net 不直接支持它。

如果您想了解更多信息,这里是 BCL 团队博客上关于该问题的三篇文章中的第一篇的链接:http: //blogs.msdn.com/bclteam/archive/2007/02/13/long-paths-in -net-part-1-of-3-kim-hamilton.aspx

于 2009-12-01T15:24:18.390 回答
1

答案在于以下几点:

问:文件名的最大字符数是多少?

答:这取决于文件是在 FAT 还是 NTFS 分区上创建的。NTFS 分区上的最大文件名长度为 256 个字符,而 FAT 上的最大文件名长度为 11 个字符(8 个字符名称,. ,3 个字符扩展名)。NTFS 文件名保持大小写,而 FAT 文件名没有大小写概念(但是在 NTFS 上执行搜索等时会忽略大小写)。新的 VFAT 也有 256 个字符的文件名。

来源

基本上,操作系统决定了最大文件大小,而不是您的应用程序。如果将来发布一个支持更多字符的更好的文件系统,您总是可以通过允许它来使您的软件向前兼容,并让用户知道路径何时过长。但是,随着当前技术的进步,您不能使用大于 256 个字符的文件名。

于 2009-12-01T15:03:48.493 回答
1

您可以使用以下方法尝试文件名的短路径版本:

  [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();
于 2009-12-01T15:10:37.657 回答
0

你不能。

请记住,Windows 中的路径必须少于 256 个字符。(除非你使用特殊技巧)

为什么你首先想要这么长的文件名?

于 2009-12-01T15:02:55.857 回答
0

正如其他人所提到的,没有绕过这个限制的好方法。但是问题不在于 NTFS,它在Win32中。如果你真的想使用 SFU,你可以创建一些非常长的路径,但它使与本机 Win32 东西的互操作变得有趣。

您可能想尝试在路径前加上 \\?\。不过,我从未尝试过使用 .NET。

于 2009-12-01T15:34:33.453 回答
0

添加\\?\到路径的开头。所以D:\<very_long_path>会变成\\?\D:\<very_long_path>. 请参阅http://msdn.microsoft.com/en-us/library/aa365247.aspx中的“最大路径长度限制”以供参考

于 2011-10-25T21:55:36.533 回答