2009-05-19 10 views
19

iki Uri nesneler bazı koduna geçti birleştirmek nasıl bir dizin ve ben denemek ve bunun gibi bunları birleştirmek, diğer bir dosya adı (veya göreli bir yol)URI'lerini

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

geçerli:

var c = new Uri(a,b); 

Ben

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

olsun

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

Temiz bir çözümün düşünemiyorum: I (ben değiştirmeniz gerekiyor eski kod olduğu gibi) Path.Combine ile aynı etkiyi elde etmek için bekliyoruz bozkır

buna. İster ilk uri bir çizgi ucunu eklemek orada

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

iyi kullanın path.combine benim cevap düzenlenebilir, onu çalıştım –

cevap

16

Eh, Uri bir şekilde'a son bölümün bir dosyadan ziyade bir dizin olduğunu söylemelisin. Sondaki bir eğik çizgi kullanmak benim için en bariz yol gibi görünüyor.

Unutmayın ki birçok Uris için, aldığınız cevap tam olarak doğrudur. Örneğin,

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

render ve "other.html" o zaman bir sondaki kullanma

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

değil

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

gider nispeten bağlantıyı gören web tarayıcısı ise "dizin" üzerine eğik Uris, göreceli Uris'in yerine geçmek yerine eklemesi gerektiğini ileri sürmenin oldukça tanıdık bir yoludur.

+0

Uri'yi kullanmak ve Path.Combine'ı kopyalamak için dizeleri ve Path. * Kullanmasını kullanmaya çalışıyorum ve bu şekilde çalışmıyor. Bunu yapmak için iyi bir yol bulamazsam PITA olacak. – BCS

+0

Neden ilk Uri'nin bir dizin olması gerektiğine * karar verildiğini ve gerektiğinde bir eğik çizgi ekleyeceğini belgeleyen Path.Combine'e benzeyen, neden sizin için statik bir yöntem oluşturmuyorsunuz? –

+0

(İsterseniz ve C# 3 kullanıyorsanız, bir uzantı yöntemi bile olabilir) –

2

değilse

çirkin çözüm, URI birden fazla eğik çizgi (/)

var a = new Uri("file:///C:/Some/Dirs/"); 
yok sayacak Uri bir / eklemek olmak

DÜZENLEME:

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

Bu neredeyse tam olarak kod değiştirildi ing :) – BCS

+0

hala ne istediğinizi anlamadım :) bir dizin uri ve bir dosya var uri, ve bunları birleştirmeye çalışıyorum, neden uri dizinin sonuna bir sondan bir eğik çizgi eklemek istemiyorum .. hayır "file: /// c: /some/dir/some.file" ve "file: /// c:/some/dir ////////////////// arasındaki fark" some.file " –

+0

İkinci uri eğik çizgiyle başlarsa çalışmıyor. –

0

Neden sadece Uri'den miras almıyorsunuz, yani. Kurucuda bunu düzeltmek için ne yapmanız gerekiyor? Refactoring bu montaj için iç veya iç erişilebilir olduğu varsayılırsa ucuzdur.

+0

Bu Jon'un seçeneği üzerinde görebileceğim hiçbir avantajı yok. Bir şey mi eksik? – BCS

+0

Muhtemelen hayır .. o zaman, yine bir, eğer bunlardan birinde bir şema parçanız varsa, dolaylı olarak özel dikkat gerektiren bir şey olduğunu söyleyebiliriz. Bu, heryerde birer editörün var olduğunu varsayıyor. Ya bunları yerinde ya da yeni tiple tamir ediyorsun. Belki de bir şeyleri özlüyorum. –

+0

Eğer onu korudum, en iyi yol, yerel beyanlar ve atama ifadeleri ve içerdiği şema parçası ile URI tipi için kod ayrıştırmak olacaktır. Oldukça güçlü bir kuraldır ve eğer içeriyorsa bir eğik çizgi ortaya çıkarır. İyi bir ayrıştırıcıya ihtiyacınız olacak, ancak hızlı bir hack bunu da yapabilir. –

5

Bu uzantı yöntemini deneyebilirsiniz! Her zaman çalışır!;-)

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; 
     } 
    } 

Angelo Alessandro

+0

Bence bu en iyi cevap. İpucu, uri tabanının bir "/" karakteri ile bitmesini sağlamaktır, diğer bir deyişle uri tabanındaki son yol elemanı yeni Uri (baz, nispi) ile kırpılacaktır. "http: // localhost/api/Controller" + "Method" => "http: // localhost/api/Method" iken "http: // localhost/api/Controller /" + "Yöntem =>" http:// localhost/aPI/Kontrolör/Yöntemi". – Frode

19

Bu sizin için hile yapmak gerekir: / önemlidir bu yüzden

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

Bu constructor standart göreli URI kuralları izleyin:

  • 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

Yalnızca etki alanından sonra başka bir yol olmadığında çalışır, örneğin: var baseUri = new Uri ("http://www.briankeating.net/api"); var absoluteUri = new Uri (baseUri, "GetDefinitions"); http://www.briankeating.net/GetDefinitions –

+3

@ bruno.bologna ile sonuçlanan GetDefinitions için api'nin yerini alacak: baseUri parametresine bir izleyen eğik çizgi ekleyin ve istediğiniz efekti elde edin: 'new Uri (new Uri (") http://briankeating.net/api/ ")," GetDefinitions "). – Kivin