You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

.NET Framework 4.6.2跨Windows环境创建长路径文件问题求助

这个问题我之前帮好几个开发者排查过,核心矛盾在于Windows 7和10对长路径的底层支持机制不同,再加上.NET Framework默认的文件操作API受传统260字符路径限制。下面给你几个能在所有Windows环境(包括Win7)稳定生效的解决方案:

方案1:先开启Windows系统的长路径支持(Win7必做)

Windows 7默认是关闭长路径支持的,不管你用什么代码,系统层面卡着就没法创建超长路径文件。有两种开启方式:

  • 注册表修改法(适合普通用户或单机部署):
    打开regedit,定位到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem,找到LongPathsEnabled(如果没有就新建一个DWORD值),把它改成1,然后重启电脑。
  • 组策略修改法(适合企业域环境):
    运行gpedit.msc,依次展开「计算机配置>管理模板>系统>文件系统」,找到「启用 Win32 长路径」策略并启用,重启后生效。

开启系统支持后,你可以在代码里给路径加上\\?\前缀绕过.NET的默认限制,比如:

// 注意:必须是绝对路径,不能用相对路径
string longAbsolutePath = @"C:\Users\YourName\...\超长长长长长路径\test.txt";
string win32LongPath = @"\\?\" + longAbsolutePath;
File.Create(win32LongPath);

如果是共享文件夹的UNC路径,要改成\\?\UNC\serverName\shareName\...的格式。

方案2:利用.NET Framework 4.6.2的原生长路径支持

从4.6.2开始,.NET已经内置了长路径兼容能力,但需要在项目的app.config里加一段配置来激活:

<configuration>
  <runtime>
    <AppContextSwitchOverrides value="Switch.System.IO.UseLegacyPathHandling=false;Switch.System.IO.BlockLongPaths=false" />
  </runtime>
</configuration>

配置完之后,你就可以直接用File.CreateDirectory.CreateDirectory这些常规API,不用加\\?\前缀,只要系统已经开启长路径支持(Win7按方案1操作,Win10大部分版本默认已开启),就能创建超长路径文件。

方案3:直接调用Win32原生API(最稳妥的兼容方案)

如果上面两种方法都有场景限制(比如不能修改app.config,或者需要更底层的控制),可以直接调用Windows的CreateFileW原生函数,完全绕开.NET的路径限制:

using System;
using System.Runtime.InteropServices;
using System.IO;

public static class LongPathHelper
{
    [DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
    private static extern IntPtr CreateFile(
        string lpFileName,
        uint dwDesiredAccess,
        uint dwShareMode,
        IntPtr lpSecurityAttributes,
        uint dwCreationDisposition,
        uint dwFlagsAndAttributes,
        IntPtr hTemplateFile);

    [DllImport("kernel32.dll", SetLastError = true)]
    private static extern bool CloseHandle(IntPtr hObject);

    private const uint GENERIC_WRITE = 0x40000000;
    private const uint FILE_SHARE_READ = 0x00000001;
    private const uint CREATE_NEW = 1;
    private const uint FILE_ATTRIBUTE_NORMAL = 0x80;

    public static void CreateLongPathFile(string path)
    {
        // 转换为Win32兼容的长路径格式
        string win32Path = Path.IsPathRooted(path) ? @"\\?\" + path : path;
        
        IntPtr fileHandle = CreateFile(
            win32Path,
            GENERIC_WRITE,
            FILE_SHARE_READ,
            IntPtr.Zero,
            CREATE_NEW,
            FILE_ATTRIBUTE_NORMAL,
            IntPtr.Zero);

        if (fileHandle == IntPtr.Zero || fileHandle == new IntPtr(-1))
        {
            throw new IOException("创建超长路径文件失败", Marshal.GetLastWin32Error());
        }

        // 记得关闭文件句柄,避免资源泄漏
        CloseHandle(fileHandle);
    }
}

调用的时候直接用LongPathHelper.CreateLongPathFile(yourLongPath)就行,这个方法只要系统开启了长路径支持,就能在Win7和Win10上稳定运行。

最后几个关键提醒:

  • Win7必须先开启长路径支持,所有方案才能生效,这是系统层面的硬限制;
  • 测试时一定要确保路径长度确实超过260字符,不然可能看不出效果;
  • 如果是部署给普通用户,最好在安装程序里自动完成注册表修改(需要管理员权限),或者写清楚操作步骤。

内容的提问来源于stack exchange,提问作者Herin

火山引擎 最新活动