Directory.CreateDirectory()我想创建一个目录,该目录长于260个字符,只是想知道是否有替代方法,尽管文件名不是很长,但目录路径却是。
要么
如果有什么窍门,我可以CreateDirectory在此位置创建一个文件夹,而无需提供目录的完整路径。当我在文件夹等内创建文件夹时。必须有一些合法的方法来执行此操作。
我现在保存在隐藏标签中的字符串存在问题,因此不再是问题。
简单的解决方案 是使用启用 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 长路径