如何在SaveFileDialog中的默认FileName中设置长字符串(> 260)?

时间:2009-12-01 14:58:11

标签: c# .net windows savefiledialog long-filenames

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

如果我设置

saveFileDialog.FileName = longFileName ;

然后我得到System.IO.PathTooLongException

我该怎么做?

7 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分: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

答案 2 :(得分:1)

答案如下:

  

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

     

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

Source

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

答案 3 :(得分: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();

答案 4 :(得分:0)

你做不到。

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

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

答案 5 :(得分:0)

正如其他人所说,没有好办法解决这个限制。但问题不在于NTFS,而在Win32。如果你真的想要使用SFU,你可以制作一些可笑的长路径,但是它使得本机Win32的内容很有趣。

您可能希望尝试使用\\?\添加路径。我从来没有尝试使用.NET。

答案 6 :(得分:0)

\\?\添加到路径的开头。因此D:\<very_long_path>将成为\\?\D:\<very_long_path>。请参阅http://msdn.microsoft.com/en-us/library/aa365247.aspx

中的参考“最大路径长度限制”