PathTooLongException C#4.5

时间:2012-10-05 13:19:13

标签: c# exception visual-studio-2012 io pathtoolongexception

我无法复制某些文件夹260+字符(例如:F:\ NNNNNNNNNNNNNNNNNNNNNNNNNNNNN \ ROOT \ $ RECYCLE.BIN \ S-1-5-21-3299053755-4209892151-505108915-1000 \ $ RMSL3U8 \ NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN添加\?\或\?\ UNC \(如“\\?\ UNC \”)只是抛出另一个ArgumentException。 我究竟做错了什么?如果不使用Directory.SetCurrentDirectory()?

,我还能做些什么

3 个答案:

答案 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.I​O 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