2012-01-06 108 views
4

只是想知道是否有替代Directory.CreateDirectory()因为我试图创建一个长度超过260个字符的目录,虽然文件名不长,但目录路径是。替代Directory.CreateDirectory(路径)支持长路径

OR

如果有使用,我可以点CreateDirectory没有给目录的完整路径,创建在这个位置的文件夹的任何伎俩。当我在文件夹内创建文件夹等等。必须有一些合法的方式来做到这一点。

有与我现在隐藏的标签保存,所以它不是一个问题了字符串问题。

回答

2

简单的解决办法是 。将使用UNC路径启用哪个 将允许多达约32767个字符的文件路径

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

这将简单地在前面加上\\路径?\它告诉框架绕过的260个字符的限制MAX_PATH。 不幸的是的前缀\\?\是不支持内净在写(如4.0版)的时间

这给我们留下了一个WINAPI解决方案并引用Kernel32.dll以使用SafeFileHandle。金汉密尔顿从BCL团队博客了一系列的解决方法,这里的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); 
    } 
} 

还有,超过在谷歌代码封装了所有这些工作图书馆称为泽塔长路径

+0

我看着它,但我不知道怎么可以我改变Windows API,或者我错过了它? – 2012-01-06 10:56:11

+0

嗯,没有像Path.ToLongPath这样的东西,因为它只是BCL对未来的建议。不幸的是.net框架不支持\\?\的简单解决方案,这意味着您需要使用http://blogs.msdn.com/b/bclteam/archive/中描述的WinApi PInvoke函数。 2007/03/26/long-paths-in-net-part-2-of-3-long-path-workarounds-kim-hamilton.aspx或使用zeta长路径 - 编辑帖子以反映这个 – Anastasiosyal 2012-01-06 11:20:03

+1

感谢您的评论,我实际上在看zeta,但使用该DLL我不能创建一个目录,它没有提到那里既没有我可以找到它,但他们说你可以得到文件计数,恐怕我不需要在这种情况下,干杯 – 2012-01-06 11:27:29

2

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

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

编辑:

另外,我找到的东西,可以帮助你解决你的问题。看看this code

+0

感谢您的回复,我尝试过,但仍然得到同样的异常。 – 2012-01-06 09:50:11

+1

请参阅编辑我的答案。 – 2012-01-06 10:20:29

+0

@ mesiesta,感谢您的编辑,我实际上看了一眼,它完全像我需要的东西,但它的文件,但我需要类似的文件夹,我想知道即使我试图改变文件夹的代码,它会去工作 – 2012-01-06 11:03:52

2

设置一个目录作为当前和它创建目录。

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

谢谢你的回复,我试过了,但仍然得到同样的异常,因为它设置当前目录,但是当你创建一个新的目录,它做它作为“CurrentDirectory”+“CreateDirectory” – 2012-01-06 09:55:48

1

怎么样使用“\”字符分割你的潜在路径,然后通过每个项目的循环,看是否存在一个目录,如果它不 - 创建它,然后使用

Directory.SetCurrentDirectory(directoryName);