5

我将 C# 与.Net v4.7.2Win10一起使用,并且我有一些具有长路径 ( >260 ) 的文件要复制。

我知道,有一个解决方案可以在路径前加上 \\?\

此前缀有效,但我不想每次都为任何文件操作添加前缀。自 .Net v4.6.2 以来,AppContext-Switches UseLegacyPathHandlingBlockLongPaths有更好的解决方案。

但是,这是行不通的。

我的app.config看起来像这样:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2"/>
  </startup>
  <windowsSettings>
    <longPathAware xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">true</longPathAware>
  </windowsSettings>
  <runtime>
    <AppContextSwitchOverrides value="Switch.System.IO.UseLegacyPathHandling=false;Switch.System.IO.BlockLongPaths=false" />
  </runtime> 
</configuration>

我的C# 代码如下所示:

public static void Main(string[] args)
{
   string src = @"c:\Temp\abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ\abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ\abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ\abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ\abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ\abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ.txt";
   string dst = @"c:\Temp\abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ\abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ\abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ\abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ\abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ\abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-123.txt";
   File.Copy(src, dst);
}

我的问题

  • 使用 .Net v4.5 File.Copy() 抛出System.IO.PathTooLongException

  • 使用 .Net v4.7.2 File.Copy() 抛出System.IO.DirectoryNotFoundException

如果设置了开关,我通过 AppContext.TryGetSwitch() 检查了它们。所以我不知道如何让我工作。

谁能解释一下,我做错了什么?感谢您的任何反馈!

——爵士

4

1 回答 1

1

您的文件名长度为 317 个字符,超过了 NTFS 路径段( #1#2)中允许的 255 个字符。

(回想起来,Jeremy 在#2 中使用一个不可能在任何文件系统上工作的示例可能是一个错误!)

于 2019-01-10T11:51:16.720 回答