支持长路径的Directory.CreateDirectory(path)的替代方法

Muh*_*aja 5 .net c#

Directory.CreateDirectory()我想创建一个目录,该目录长于260个字符,只是想知道是否有替代方法,尽管文件名不是很长,但目录路径却是。

要么

如果有什么窍门,我可以CreateDirectory在此位置创建一个文件夹,而无需提供目录的完整路径。当我在文件夹等内创建文件夹时。必须有一些合法的方法来执行此操作。

我现在保存在隐藏标签中的字符串存在问题,因此不再是问题。

Ana*_*yal 2

简单的解决方案 使用启用 unc 的路径,该路径允许文件路径最多约 32767 个字符

string longPathEnabledFileName = Path.ToLongPath("C:\SomeVeryLongPath\...."); 
FileStream fs = new FileStream(longPathEnabledFileName);
Run Code Online (Sandbox Code Playgroud)

这将简单地在路径前面加上 \\?\ ,告诉框架绕过 260 个字符的 MAX_PATH 限制。不幸的是,在撰写本文时,.Net不支持\\?\ 前缀(从版本 4.0 开始)

这给我们留下了一个 WinApi 解决方案并引用 Kernel32.dll 来使用 SafeFileHandle。BCL 团队的 Kim Hamilton 在博客中发布了一系列针对 MAX_PATH 限制的解决方法(第 2 部分展示了如何使用 winapi 函数),其中包含一个代码片段以供参考:

// 此代码片段是在 Microsoft 许可协议下提供的。
使用系统;
使用系统.IO;
使用 System.Runtime.InteropServices;
使用 Microsoft.Win32.SafeHandles;

[DllImport(“kernel32.dll”,SetLastError = true,CharSet = CharSet.Unicode)]
内部静态外部 SafeFileHandle CreateFile(
    字符串 lpFileName,
    EFileAccess dwDesiredAccess,
    EFileShare dwShareMode,
    IntPtr lpSecurity属性,
    ECreationDisposition dwCreationDisposition,
    EFileAttributes dwFlagsAndAttributes,
    IntPtr hTemplateFile);

公共静态无效TestCreateAndWrite(字符串文件名){

    字符串格式名称 = @"\\?\" + 文件名;
    // 创建一个具有通用写访问权限的文件
    SafeFileHandle fileHandle = CreateFile(formattedName,
        EFileAccess.GenericWrite、EFileShare.None、IntPtr.Zero、
        ECreationDisposition.CreateAlways, 0, IntPtr.Zero);

    // 检查是否有错误
    int lastWin32Error = Marshal.GetLastWin32Error();
    if (fileHandle.IsInvalid) {
        抛出新的 System.ComponentModel.Win32Exception(lastWin32Error);
    }

    // 将文件句柄传递给 FileStream。FileStream 将关闭
    // 处理
    使用 (FileStream fs = new FileStream(fileHandle,
                                    文件访问.Write)) {
        fs.WriteByte(80);
        fs.WriteByte(81);
        fs.WriteByte(83);
        fs.WriteByte(84);
    }
}

还有一个库封装了谷歌代码中的所有这些工作,称为 zeta 长路径