2009-02-06 3 views
18

경로가 UNC 경로인지 확인하는 가장 쉬운 방법은 물론 전체 경로의 첫 번째 문자가 문자 또는 백 슬래시인지 확인하는 것입니다. 이것은 좋은 해결책입니까 아니면 문제가있을 수 있습니까?경로가 UNC 경로 또는 로컬 경로인지 확인하는 올바른 방법은 무엇입니까?

내 특정 문제는 경로에 드라이브 문자가있는 경우 System.IO.DriveInfo 개체를 만들려고한다는 것입니다.

답변

13

첫 번째와 두 번째 위치에 두 개의 백 슬래시가없는 경로는 UNC 경로가 아니기 때문에이 결정을 내리는 데 안전한 방법입니다.

첫 번째 위치 (c :)에있는 드라이브 문자가있는 경로는 루팅 된 로컬 경로입니다.

이 중 하나가없는 경로 (myfolder \ blah)는 상대 로컬 경로입니다. 여기에는 하나의 슬래시 (\ myfolder \ blah) 만있는 경로가 포함됩니다.

+0

경로를 시작하려면 적어도 "\\"를 확인해야합니다 ("\ this \ is \ not \ a \ unc \ path"). 경로에 포함시키는 것이 특히 좋은 것은 아니지만 UNC에 관계없이). –

+0

맞아. 내 대답을 수정했습니다. – TheSmurf

+1

경로 구분 기호가 다른 지역 시스템은 어떻게됩니까? 예 : 일본 시스템의 경우 –

10

가장 정확한 방법은 shlwapi.dll에서

[DllImport("shlwapi.dll", CharSet = CharSet.Unicode)] 
[ResourceExposure(ResourceScope.None)] 
[return: MarshalAsAttribute(UnmanagedType.Bool)] 
internal static extern bool PathIsUNC([MarshalAsAttribute(UnmanagedType.LPWStr), In] string pszPath); 

일부 상호 운용성 코드를 사용하는 것입니다 당신은 다음과 같이 호출합니다 :

/// <summary> 
    /// Determines if the string is a valid Universal Naming Convention (UNC) 
    /// for a server and share path. 
    /// </summary> 
    /// <param name="path">The path to be tested.</param> 
    /// <returns><see langword="true"/> if the path is a valid UNC path; 
    /// otherwise, <see langword="false"/>.</returns> 
    public static bool IsUncPath(string path) 
    { 
     return PathIsUNC(path); 
    } 

@JaredPar 사용 최선의 답이있다 purely managed code.

+0

완벽! 고마워요. – om471987

11

이 확장 방법

public static bool IsUncDrive(this DriveInfo info) { 
    Uri uri = null; 
    if (!Uri.TryCreate(info.Name, UriKind.Absolute, out uri)) { 
    return false; 
    } 
    return uri.IsUnc; 
} 
+4

DriveInfo 개체는 UNC 경로에 사용할 수 없습니다. 그러나 DirectoryInfo 확장명으로 변경하고 이름 대신 FullName을 사용하면 제대로 작동하는 것 같습니다. –

+1

'Uri.TryCreate' 대신'DirectoryInfo.DriveType == DriveType.Network'를 사용하지 않는 이유가 있습니까? – larsmoa

1

을보십시오이 내 버전 :

public static bool IsUnc(string path) 
{ 
    string root = Path.GetPathRoot(path); 

    // Check if root starts with "\\", clearly an UNC 
    if (root.StartsWith(@"\\")) 
    return true; 

    // Check if the drive is a network drive 
    DriveInfo drive = new DriveInfo(root); 
    if (drive.DriveType == DriveType.Network) 
    return true; 

    return false; 
} 

@JaredPars 버전 이상이 버전의 장점이 어떤 경로뿐만 아니라 DriveInfo를 지원한다는 것입니다.내가 찾은

4

한 트릭은 DINFO가의 DirectoryInfo 개체입니다 dInfo.FullName.StartsWith(String.Empty.PadLeft(2, IO.Path.DirectorySeparatorChar))을 사용하는 것입니다 - 그 검사가 True를 반환하는 경우는, 그렇지 않으면 어쩌면이 대답은 사람에게 도움이 될 수있는 로컬 경로

+4

또는'.StartsWith (새 문자열 (Path.DirectorySeparatorChar, 2))'입니다. – jnm2

0

UNC 경로입니다 누가 네트워크 경로의 예를 들어, UNC 서버 + 주 + 서브 디렉토리만 확인하고 싶어 저장소와 같은

  • \\Server1\Share1
  • \\Server2\Share22\Dir1\Dir2
  • ,
  • \\Server3

는 다음과 같은 정규식 사용 :

  • 가 허용되는 최대 경로 깊이 10을 대체 서버/디렉토리 이름의 최대 허용 길이

    ^\\\\([A-Za-z0-9_\-]{1,32}[/\\]){0,10}[A-Za-z0-9_\-]{1,32}$ 
    
    • 32 (2 번) 교체를 (최대 디렉토리 수)
    • 연장 [A-Za-z0-9_\-] (2 회) m 서버/디렉토리 이름에 허용되는 문자를 입력하십시오.

    성공적으로 테스트했습니다. 즐겨!