【发布时间】:2017-06-29 18:54:06
【问题描述】:
如何使用 vb.net 创建长度超过 260 个字符的文件的副本,包括文件名
当我们尝试使用 File.Copy 方法创建副本时,它会抛出如下异常:
“指定的路径、文件名或两者都太长。完全限定的文件名必须少于 260 个字符,目录名必须少于 248 个字符。”
有没有可能,那请帮忙...
【问题讨论】:
如何使用 vb.net 创建长度超过 260 个字符的文件的副本,包括文件名
当我们尝试使用 File.Copy 方法创建副本时,它会抛出如下异常:
“指定的路径、文件名或两者都太长。完全限定的文件名必须少于 260 个字符,目录名必须少于 248 个字符。”
有没有可能,那请帮忙...
【问题讨论】:
您遇到了 MAX_PATH 限制。作为一种解决方法,您应该能够直接 P/Invoke 到 kernel32.dll 的 CopyFile 函数,并在目标路径前使用“\\?\”前缀来防止遇到 MAX_PATH 问题。
请注意,虽然您能够以大多数应用无法打开文件的方式复制文件,但它们也受到 MAX_PATH 的限制。
可以在这里找到问题的一个很好的概述:http://blogs.msdn.com/bclteam/archive/2007/02/13/long-paths-in-net-part-1-of-3-kim-hamilton.aspx
可以在第 2 部分中找到使用 C# 对这些方法进行 P/Invoking 的一些示例代码:http://blogs.msdn.com/bclteam/archive/2007/03/26/long-paths-in-net-part-2-of-3-long-path-workarounds-kim-hamilton.aspx
schnaader linked 看起来像它的库将为您省去 P/Invoking 到 kernel32.dll 的问题,不确定您是否要依赖外部 dll。
【讨论】:
有一些缩短名称的技巧...请参阅http://support.microsoft.com/?kbid=320081#上标题为“原因 4:文件存在于比 MAX_PATH 字符更深的路径中”的部分
【讨论】:
CopyFile)比我的好。
您会在此处找到支持长文件名的complete library。
【讨论】:
我得到了关于这个问题的解决方案。
在研发中我发现我们可以重命名指定的路径目录,即使总长度超过 260 个字符,然后我们可以将文件从指定位置复制到新的(临时)位置以进行扫描。最后我们可以再次将文件路径名重命名为原来的。
【讨论】:
jdelimon 已经指向 Delimon.Win32.IO 库,但他们最后一次更新它是 2012 年(.Net 2.0)。这是另一个库:AlphaFS
他们升级到 .Net 4.5.2(2017 年 6 月 29 日)。我使用了一个非常短的#C 程序作为 Excel 的 COM 插件。请参阅 this link in how to create a program 和 this link for the copy-program。您只需将程序分配给 .NET 4.5,添加对 4.5 的 AlphaFS.dll 的引用并将using System.IO 替换为using Alphaleonis.Win32.Filesystem;。
【讨论】:
在这种情况下我通常会做的是:
1) 统计文件名length
2) 如果FileNameLength > 259 则裁剪文件名以处理新名称,然后复制具有裁剪目标名称的文件。
【讨论】:
【讨论】: