2012-01-06 106 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);