只是想知道是否有替代Directory.CreateDirectory()
因为我试图创建一个长度超过260个字符的目录,虽然文件名不长,但目录路径是。替代Directory.CreateDirectory(路径)支持长路径
OR
如果有使用,我可以点CreateDirectory
没有给目录的完整路径,创建在这个位置的文件夹的任何伎俩。当我在文件夹内创建文件夹等等。必须有一些合法的方式来做到这一点。
有与我现在隐藏的标签保存,所以它不是一个问题了字符串问题。
只是想知道是否有替代Directory.CreateDirectory()
因为我试图创建一个长度超过260个字符的目录,虽然文件名不长,但目录路径是。替代Directory.CreateDirectory(路径)支持长路径
OR
如果有使用,我可以点CreateDirectory
没有给目录的完整路径,创建在这个位置的文件夹的任何伎俩。当我在文件夹内创建文件夹等等。必须有一些合法的方式来做到这一点。
有与我现在隐藏的标签保存,所以它不是一个问题了字符串问题。
简单的解决办法是
。将使用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); } }
还有,超过在谷歌代码封装了所有这些工作图书馆称为泽塔长路径
的另一种方法是使用DirectoryInfo
类和方法DirectoryInfo.Create
。
我没有尝试,但MSDN表明,当使用时间过长路径它不抛出异常。
编辑:
另外,我找到的东西,可以帮助你解决你的问题。看看this code
感谢您的回复,我尝试过,但仍然得到同样的异常。 – 2012-01-06 09:50:11
请参阅编辑我的答案。 – 2012-01-06 10:20:29
@ mesiesta,感谢您的编辑,我实际上看了一眼,它完全像我需要的东西,但它的文件,但我需要类似的文件夹,我想知道即使我试图改变文件夹的代码,它会去工作 – 2012-01-06 11:03:52
设置一个目录作为当前和它创建目录。
Directory.SetCurrentDirectory(@"c:\sample");
Directory.CreateDirectory("test");
谢谢你的回复,我试过了,但仍然得到同样的异常,因为它设置当前目录,但是当你创建一个新的目录,它做它作为“CurrentDirectory”+“CreateDirectory” – 2012-01-06 09:55:48
怎么样使用“\”字符分割你的潜在路径,然后通过每个项目的循环,看是否存在一个目录,如果它不 - 创建它,然后使用
Directory.SetCurrentDirectory(directoryName);
我看着它,但我不知道怎么可以我改变Windows API,或者我错过了它? – 2012-01-06 10:56:11
嗯,没有像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
感谢您的评论,我实际上在看zeta,但使用该DLL我不能创建一个目录,它没有提到那里既没有我可以找到它,但他们说你可以得到文件计数,恐怕我不需要在这种情况下,干杯 – 2012-01-06 11:27:29