我无法复制某些文件夹260+字符(例如:F:\ NNNNNNNNNNNNNNNNNNNNNNNNNNNNN \ ROOT \ $ RECYCLE.BIN \ S-1-5-21-3299053755-4209892151-505108915-1000 \ $ RMSL3U8 \ NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN添加\?\或\?\ UNC \(如“\\?\ UNC \”)只是抛出另一个ArgumentException。 我究竟做错了什么?如果不使用Directory.SetCurrentDirectory()?
,我还能做些什么答案 0 :(得分:7)
实际上你需要从c#调用win32。我们已经完成了这个
using System;
using System.IO;
using System.Runtime.InteropServices;
using Microsoft.Win32.SafeHandles;
public static class LongPath
{
static class Win32Native
{
[StructLayout(LayoutKind.Sequential)]
public class SECURITY_ATTRIBUTES
{
public int nLength;
public IntPtr pSecurityDescriptor;
public int bInheritHandle;
}
[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern bool CreateDirectory(string lpPathName, SECURITY_ATTRIBUTES lpSecurityAttributes);
[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern SafeFileHandle CreateFile(string lpFileName, int dwDesiredAccess, FileShare dwShareMode, SECURITY_ATTRIBUTES securityAttrs, FileMode dwCreationDisposition, int dwFlagsAndAttributes, IntPtr hTemplateFile);
}
public static bool CreateDirectory(string path)
{
return Win32Native.CreateDirectory(String.Concat(@"\\?\", path), null);
}
public static FileStream Open(string path, FileMode mode, FileAccess access)
{
SafeFileHandle handle = Win32Native.CreateFile(String.Concat(@"\\?\", path), (int)0x10000000, FileShare.None, null, mode, (int)0x00000080, IntPtr.Zero);
if (handle.IsInvalid)
{
throw new System.ComponentModel.Win32Exception();
}
return new FileStream(handle, access);
}
}
示例代码:
string path = @"c:\".PadRight(255, 'a');
LongPath.CreateDirectory(path);
path = String.Concat(path, @"\", "".PadRight(255, 'a'));
LongPath.CreateDirectory(path);
string filename = Path.Combine(path, "test.txt");
FileStream fs = LongPath.Open(filename, FileMode.CreateNew, FileAccess.Write);
using (StreamWriter sw = new StreamWriter(fs))
{
sw.WriteLine("abc");
}
答案 1 :(得分:7)
Microsoft TechNet上有一个很棒的库,用于克服长文件名问题,它叫做 Delimon.Win32.IO Library (V4.0) ,它有自己的System.IO关键方法版本
例如,您将替换:
System.IO.Directory.GetFiles
与
Delimon.Win32.IO.Directory.GetFiles
可让您处理长文件和文件夹。
来自网站:
Delimon.Win32.IO取代了System.IO和。的基本文件功能 支持File&文件夹名称最多为32,767个字符。
此库是在.NET Framework 4.0上编写的,也可以使用 在x86& x64系统。文件&文件夹限制标准 System.IO命名空间可以处理a中包含260个字符的文件 文件名和文件夹名中的240个字符(通常是MAX_PATH 配置为260个字符)。通常你会碰到 System.IO.PathTooLongException标准.NET库出错。
答案 2 :(得分:4)
是的,使用标准API会给你这种限制(255个字符IIRC)。
从.NET可以使用AlphaFS project,它允许您使用非常长的路径(使用“\\?\”样式)并模仿System.IO命名空间。
您可能就像使用System.IO一样使用此库,例如:AlphaFS.Win32.Filesystem。 File.Copy()而不是System.IO。 File.Copy()
如果您不想或不能使用AlphaFS,您必须对Win32 API进行pinvoke