2012-01-06 2 views
4

Directory.CreateDirectory()에 대한 대안이 있는지 궁금해합니다. 파일 이름이 길지 만 디렉토리 경로는 있지만 260 자 이상의 디렉토리를 만들려고합니다. .긴 경로를 지원하는 Directory.CreateDirectory (경로) 대신

또는

내가 디렉토리의 전체 경로를주지 않고이 위치에 폴더를 만들 CreateDirectory을 가리킬 수있는 사용하는 트릭이있는 경우. 폴더 안에 폴더를 만들 때 등등 .. 합법적 인 방법이 있어야합니다.

숨겨진 라벨에 저장하고있는 문자열에 문제가있어 더 이상 문제가되지 않습니다.

답변

2

간단한 솔루션 까지 약 32,767 문자의 파일 경로를 허용 할 것이다 이는 UNC 가능 경로를 사용하는 것입니다

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

그러면 프레임 워크에 260 문자의 MAX_PATH 제한을 우회하도록 지시하는 \\? \가있는 경로 앞에 추가됩니다. 불행하게도의 접두사 \\? \입니다 하지

이는 WINAPI 솔루션으로 우리를 잎 (버전 4.0로) 작성시 닷넷에서 지원 SafeFileHandle을 사용하려면 Kernel32.dll을 참조하십시오.

 
// 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를 변경, 아니면 그냥 놓친거야? –

+0

Hmmm, 그렇습니다. 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 또는 제타 긴 경로 사용 - 의견을 반영하여이 – Anastasiosyal

+1

을 반영하여 게시물을 편집하십시오. 실제로 제타를보고 있었지만 그 dll을 사용하여 디렉토리를 만들 수는 없습니다. 그 곳에서 찾을 수는 없지만 파일 컨트랙션을 얻을 수 있다고 말하면서이 컨텍스트에서 필요없는 건 두려워합니다. –

2

대체 방법은 DirectoryInfo 클래스와 방법 DirectoryInfo.Create을 사용하는 것입니다.

나는 그것을 시도하지는 않았지만 MSDN은 너무 긴 경로를 사용할 때 예외가 발생하지 않는다는 것을 보여줍니다.

편집 :

은 또한, 나는 당신이 당신의 문제를 해결하는 데 도움이 될 수 있습니다 뭔가를 발견했습니다. 현재와 ​​같은 디렉토리를 설정 this code

+0

감사도있다, 나는 그것을 시도했지만 여전히 같은 예외를 받고. –

+1

편집 내 대답보기. –

+0

@ mesiesta, 편집 해 주셔서 고맙습니다. 이전에 실제로 보았습니다. 그 파일은 내가 필요로하지만 폴더와 비슷한 것이 필요합니다. 폴더에 대한 코드를 변경하려고해도 궁금합니다. work –

2

를 살펴보고 그 안에 디렉토리를 생성합니다.

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

답장을 보내 주셔서 감사합니다.하지만 현재 디렉토리를 설정하는 것과 동일한 예외가 발생했지만 새 디렉토리를 만들 때 "CurrentDirectory"+ "CreateDirectory"로 수행합니다. –

1

디렉토리가있는 경우 그렇지 않은 경우, 각 항목을 통해 반복 다음, '\'문자를 사용하여 미래의 경로를 분할보고에 대해 어떻게 -를 만든 다음 사용

Directory.SetCurrentDirectory(directoryName); 
관련 문제