只是想知道是否有替代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