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

时间:2012-01-06 09:42:36

标签: c# .net

只是想知道是否有Directory.CreateDirectory()的替代方法,因为我正在尝试创建一个超过260个字符的目录,尽管文件名不长但是目录路径是。

OR

如果有任何技巧我可以指示CreateDirectory在此位置创建文件夹而不提供完整的目录路径。当我在文件夹中创建文件夹等等时。必须有一些合法的方法来做到这一点。

我现在保存在隐藏标签中的字符串存在问题所以它不再是问题了。

4 个答案:

答案 0 :(得分:2)

另一种方法是使用DirectoryInfo类和方法DirectoryInfo.Create

我没有尝试过,但MSDN表明当你使用太长的路径时它不会抛出异常。

修改

此外,我找到了一些可以帮助您解决问题的方法。看看this code

答案 1 :(得分:2)

将目录设置为current和create directory。

 Directory.SetCurrentDirectory(@"c:\sample");
 Directory.CreateDirectory("test");

答案 2 :(得分:2)

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

string longPathEnabledFileName = Path.ToLongPath("C:\SomeVeryLongPath\...."); 
FileStream fs = new FileStream(longPathEnabledFileName);

这只是在路径前面加上\\?\,它告诉框架绕过260个字符的MAX_PATH限制。 很遗憾,在撰写本文时(。从4.0版开始),.Net中的\ strong?不支持的前缀

这使我们得到一个WinApi解决方案并引用Kernel32.dll来使用SafeFileHandle。来自BCL团队的Kim Hamilton在此处发布了一系列有关MAX_PATH限制的解决方法(第2部分展示了如何使用winapi函数),其中包含的代码片段仅供参考:

// This code snippet is provided under the Microsoft Permissive License.
using System;
using System.IO;
using System.Runtime.InteropServices;
using Microsoft.Win32.SafeHandles;

[DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
internal static extern SafeFileHandle CreateFile(
    string lpFileName,
    EFileAccess dwDesiredAccess,
    EFileShare dwShareMode,
    IntPtr lpSecurityAttributes,
    ECreationDisposition dwCreationDisposition,
    EFileAttributes dwFlagsAndAttributes,
    IntPtr hTemplateFile);

public static void TestCreateAndWrite(string fileName) {

    string formattedName = @"\\?\" + fileName;
    // Create a file with generic write access
    SafeFileHandle fileHandle = CreateFile(formattedName,
        EFileAccess.GenericWrite, EFileShare.None, IntPtr.Zero,
        ECreationDisposition.CreateAlways, 0, IntPtr.Zero);

    // Check for errors
    int lastWin32Error = Marshal.GetLastWin32Error();
    if (fileHandle.IsInvalid) {
        throw new System.ComponentModel.Win32Exception(lastWin32Error);
    }

    // Pass the file handle to FileStream. FileStream will close the
    // handle
    using (FileStream fs = new FileStream(fileHandle,
                                    FileAccess.Write)) {
        fs.WriteByte(80);
        fs.WriteByte(81);
        fs.WriteByte(83);
        fs.WriteByte(84);
    }
}

还有一个库将所有这些工作封装在名为zeta long paths的谷歌代码中

答案 3 :(得分:1)

如何使用'\'字符拆分您的预期路径,然后循环遍历每个项目,查看目录是否存在,如果不存在 - 创建它,然后使用

Directory.SetCurrentDirectory(directoryName);