2009-05-19 3 views
19

나는이 열린 우리당의 객체가 어떤 코드로 통과를 결합하는 방법, 하나는 디렉토리이고 나는 시도하고 같이 그들을 결합 할 때 다른 파일 이름 (또는 상대 경로)은 URI를

var a = new Uri("file:///C:/Some/Dirs"); 
var b = new Uri("some.file"); 

입니다 :

var c = new Uri(a,b); 

나는

file:///C:/Some/some.file

얻을

file:///C:/Some/Dirs/some.file

내가 깨끗한 솔루션 생각할 수 없다 : I (즉 내가 교체해야하는 기존의 코드로) Path.Combine와 같은 효과를 얻을 것으로 기대 고원

이에. 그 첫 번째 URI의 슬래시 끝을 추가가

string s = a.OriginalString; 
if(s[s.Length-1] != '/') 
    a = new Uri(s + "/"); 
+0

아니라, 사용 path.combine 내가 내 대답을 편집을 내가 시도한 작품 –

답변

16

자, 우리 한테 라고 말해야 만합니다. 마지막 부분은 파일이 아니라 디렉토리입니다. 후행 슬래시를 사용하는 것이 나에게 가장 확실한 방법 인 것 같습니다.

많은 Uris의 경우 사용자가 가지고있는 대답이 정확하다는 것을 명심하십시오. 예를 들어,

http://foo.com/bar/index.html 

렌더링 그것은 "other.html"그 다음 뒤에 사용

http://foo.com/bar/other.html 

하지

http://foo.com/bar/index.html/other.html 

로 이동 상대적 링크를보고 웹 브라우저 인 경우 "디렉토리"에 슬래시를 붙입니다. Uris는 상대적인 Uris가 대체하는 대신에 추가해야한다고 제안하는 꽤 익숙한 방법입니다.

+0

문자열 및 경로. *에서 Uri를 사용하여 Path.Combine을 복제해야하므로이 방법으로는 변환 할 수 없습니다. 내가 이것을 할 좋은 방법을 찾지 못한다면 그것은 PITA가 될 것입니다. – BCS

+0

Path.Combine과 비슷한 정적 방법을 만들어 보시지 않겠습니까? 첫 번째 Uri는 디렉토리가 될 것이라는 가정하에 * 필요한 * 경우 슬래시가 추가됩니다. –

+0

(원한다면 C# 3을 사용하는 경우 확장 메서드 일 수도 있습니다.) –

2

아니라면

는 못생긴 솔루션은 URI는 하나 이상의 슬래시 (/)

var a = new Uri("file:///C:/Some/Dirs/"); 
을 무시 열린 우리당에 /을 추가 할 수있는

편집 :

var a = new Uri("file:///C:/Some/Dirs"); 
var b = new Uri("some.file", UriKind.Relative); 
var c = new Uri(Path.Combine(a.ToString(), b.ToString())); 
MessageBox.Show(c.AbsoluteUri); 
+1

그건 내가 대체 코드가 주어진 거의 정확한 코드예요. ing :) – BCS

+0

나는 아직도 당신이 원하는 것을 이해하지 못한다. : 당신은 디렉토리 uri와 파일 uri를 갖고있다. 그리고 그들을 결합하려고하는데, 왜 당신은 디렉토리 uri의 끝에 직접 슬래시를 추가하고 싶지 않다. "file : /// c : /some/dir/some.file"과 "file : /// c :/some/dir /////////////////////////////////////////////////////////////////// some.file " –

+0

두 번째 URI가 슬래시로 시작하면 작동하지 않습니다. –

0

왜 우리는 Uri로부터 상속을 받아 사용하지 않습니까? 생성자에서 당신이 그것을 고치기 위해해야 ​​할 일을합니까? 리팩토링은 어셈블리 내부 나 범위 내에 있다고 가정 할 때 값이 싸다.

+0

그건 내가 존의 선택권보다 더 유리한 점이 없다. 내가 놓친 게 있니? – BCS

+0

아마 .. 다시는, 만약 당신이 그들 중 하나에 계획 부분이 있다면, 당신은 이미 암시 적으로 그것은 특별한주의를 요하는 것이라고 말할 수 있습니다. 이것은 당신이 리터럴을 가지고 있다고 가정합니다. 당신은 리터럴이나 새로운 타입의 사이트에서 그것을 고칠 수 있습니다. 아마 나는 뭔가를 놓치고 있습니다. –

+0

내가 이해한다면 가장 좋은 방법은 로컬 선언과 할당 표현식을위한 코드와 구성 부분이 포함 된 URI 형식을 분석하는 것입니다. 꽤 강력한 규칙, 그리고 그것이 포함되어 있다면 슬래시를 소개합니다. 좋은 파서가 필요하지만 빠른 해킹도 가능합니다. –

5

이 확장 메서드를 사용해 볼 수있다! 항상 일합니다!;-)

public static class StringExtension 
    { 
     public static string UriCombine(this string str, string param) 
     { 
      if (!str.EndsWith("/")) 
      { 
       str = str + "/"; 
      } 
      var uri = new Uri(str); 
      return new Uri(uri, param).AbsoluteUri; 
     } 
    } 

안젤로, 알레산드로

+0

이것이 최고의 대답이라고 생각합니다. 단서는 기본 URI가 "/"문자로 끝나도록 보장하는 것입니다. 그 외에도 기본 URI의 마지막 경로 요소는 새로운 URI (기본, 상대적)로 잘립니다. "http : // localhost/api/Controller /"+ "Method =>" "http : // localhost/api/Controller"/localhost/api/Controller/Method "를 참조하십시오. – Frode

19

이것은 트릭을해야 다음 /이 중요하므로

var baseUri = new Uri("http://www.briankeating.net"); 
var absoluteUri = new Uri(baseUri, "/api/GetDefinitions"); 

constructor 표준 상대 URI 규칙을 따르

  • http://example.net + foo = http://example.net/foo
  • http://example.net/foo/bar + baz = http://example.net/foo/baz
  • http://example.net/foo/ + bar = http://example.net/foo/bar
  • http://example.net/foo + bar = http://example.net/bar
  • http://example.net/foo/bar/ + /baz = http://example.net/baz
+1

도메인 뒤에 다른 경로가없는 경우에만 작동합니다 (예 : var baseUri = new Uri ("http://www.briankeating.net/api"); var absoluteUri = new Uri (baseUri, "GetDefinitions"); http://www.briankeating.net/GetDefinitions의 결과로 GetDefinitions에 대한 api를 바꿉니다. –

+3

@ bruno.bologna : baseUri 매개 변수에 후행 슬래시를 추가하면 원하는 결과가 나타납니다. 새 Uri (새 Uri (" http://briankeating.net/api/ "),"GetDefinitions ")'. – Kivin

관련 문제