2012-11-01 3 views
12

다른 유형의 경로/URL을 수신 할 수있는 객체를 작성하고 어떤 유형의 경로/URL을 반환 할 작업이 있습니다. 예를 들어, 경로는물리적, 상대, 절대 및 기타 경로

1. [drive]:\Temp 
2. \\Temp 
3. Temp (assuming that it relative Temp), 
4. /Temp 
5. ~/Temp 
6. file://[drive]:/Temp 
7. file://Temp 
8. [scheme]://something/Temp 

... 등이 될 수 있습니다.

실제 경로, 상대 URL 또는 절대 URL 인 경우 C#을 어떻게 확인할 수 있습니까?

상대적이거나 절대적인 URI인지 여부는 비교적 쉽게 알 수 있지만 UNC 경로인지 어떻게 알 수 있습니까?

Uri 객체를 사용하려고했지만 IsUnc 속성을 사용하려고했지만 실제로는 도움이되지 않습니다. c : \ temp의 경우 "/ temp", "temp /"및 "temp"에 대해 false를 반환합니다. 형식이 올바르지 않은 예외입니다. 어떤 도움이 될 .NET 3.5에 객체가 내장되어 있습니까? 아니면 어떤 알고리즘을 사용하여 경로 유형을 결정할 수 있습니까?

+0

글쎄, "/ 온도는"전혀 사실이 아닌 URI입니다. 확인하려는 정확한 형식은 무엇입니까? 경로 및 URI 일 경우 우선 경로를 구별하고 각각에 대해 서로 다른 기술을 적용 할 수 있습니다. – Vlad

+0

"/ temp"가 유효한 URI가 아닌 이유는 무엇입니까? 나는 그것이 친척으로 해석 될 수 있다고 생각한다. 모든 형식을 확인하고 어떤 형식인지 결정해야합니다 ... UNC 경로인지 또는 URI 경로인지 ... 어떻게 구분할 수 있습니까? –

+0

음, http://tools.ietf.org/html/rfc3986. – Vlad

답변

28

이 시도 :

var paths = new[] 
{ 
    @"C:\Temp", 
    @"\\Temp", 
    "Temp", 
    "/Temp", 
    "~/Temp", 
    "file://C:/Temp", 
    "file://Temp", 
    "http://something/Temp" 
}; 

foreach (string p in paths) 
{ 
    Uri uri; 
    if (!Uri.TryCreate(p, UriKind.RelativeOrAbsolute, out uri)) 
    { 
     Console.WriteLine("'{0}' is not a valid URI", p); 
    } 
    else if (!uri.IsAbsoluteUri) 
    { 
     Console.WriteLine("'{0}' is a relative URI", p); 
    } 
    else if (uri.IsFile) 
    { 
     if (uri.IsUnc) 
     { 
     Console.WriteLine("'{0}' is a UNC path", p); 
     } 
     else 
     { 
     Console.WriteLine("'{0}' is a file URI", p); 
     } 
    } 
    else 
    { 
     Console.WriteLine("'{0}' is an absolute URI", p); 
    } 
} 

출력 :

'C : \ 온도'파일 URI
'\\ 온도'는 UNC 경로는이이
'온도'는 것입니다 상대 URI
'/ 온도'는 상대 URI
입니다 '~/온도'상대 URI
입니다 '파일 : // C :/온도'파일이 URI입니다 '파일 : // 온도'는 UNC 경로
'에 http : // 뭔가/온도'는 절대 URI

+0

감사합니다. 값 'C : \ Temp', '\\ Temp', 'file : // C :/Temp'및 'file : // Temp'내 객체는 URI가 아니라 "PhysicalPath"를 반환해야합니다. –

+0

그런 다음 'UNC 경로'및 '파일 URI'대신 'PhysicalPath'를 인쇄하도록 'IsFile'분기를 변경하십시오. –

+0

System.Uri는 protocol-relative를 상대 경로로 취급하지만 대부분의 보안 컨텍스트에서는 절대 경로처럼 취급해야합니다. 그래서'http : // gmail.com'은 절대적이지만'// gmail.com은 상대 도메인이지만 다른 도메인으로 이동하는 경우에도 마찬가지입니다. – yzorg