2009-09-09 25 views
64

Bir Windows uygulamasında bir göreli yolu mutlak yola nasıl dönüştürebilirim?Bir Windows uygulamasında göreli yolu mutlak yola dönüştürme nasıl yapılır?

ASP.NET'te server.MapPath() yöntemini kullanabileceğimizi biliyorum. Ama bir Windows uygulamasında ne yapabiliriz? varsa

Ben bir .NET o işleyebilir yerleşik işlev ...

+1

Eğer .exe konumuna göre diğer bir deyişle geçerli dizine göreli bir yol, çalışma dizinini veya ifade ediyor mu? –

+1

İki tür göreli yol vardır. Biri "A \ B \ C" biçimindeyse ve belirli bir tabana işaret etmiyorsa. Diğeri ise ". \ A \ B" veya ".. \ A \ B" biçimindedir; Geçerli çalışma dizinine göre bunlar. – MSalters

+0

@Amit Dhall: Bu arada, size yardımcı olacak cevapları kabul etmek ve yanıtlamak iyi bir şeydir. –

cevap

129

denedin demek:

string absolute = Path.GetFullPath(relative); 

? Bu işlemin geçerli çalışma dizinini, yürütülebilir dosyayı içeren dizini kullanmayacağını unutmayın. Bu yardımcı olmazsa, lütfen sorunuza açıklık getirin. Eğer almak istiyorsanız

+2

Bu, exe'nin bulunduğu yere bağlı olarak, uygulamayı nereden başlattığınıza bağlı olmaz mı? Verilen soru bu konuda net değil. –

+0

Dediğiniz gibi, soru açık değil. GetFullPath geçerli çalışma dizininden çözecektir. Bunu belirtmek için yanıtımı düzenlerim. –

+0

Bir uygulama Windows Gezgini ile başlatılırsa, geçerli dizin ve yürütme derleme dizininin aynı olduğu anlaşılır (en azından bunları farklı yapmak için bir şey yapana kadar). Kısa kesimin tamamen farklı bir yerde bulunduğu yürütülebilir kısaltmayı kullansanız bile bu doğrudur. – H2ONaCl

17

sizin .exe yolu göreli sonra

string absolute = Path.Combine(Application.ExecutablePath, relative); 
+1

Veya daha genel olarak, Path.Combine (myBasePath, relative) ... –

+3

Sadece Path.Combine ile dikkatli olun. Eğer 'akraba' kısmı bir eğik çizgi ile başlarsa, düşündüğünüzü yapamaz. –

+1

@silky: Peki, o zaman akraba değil, değil mi? –

11

Bu seferki sürücü göreli yollar için farklı sürücüler, üzerinde yolları için ve gerçek göreli yollar için çalışır kullanın. Heck, basePath aslında mutlak değilse bile çalışır; her zaman geçerli çalışma dizinini son geri dönüş olarak kullanır.

public static String GetAbsolutePath(String relativePath, String basePath) 
{ 
    if (relativePath == null) 
     return null; 
    if (basePath == null) 
     basePath = Path.GetFullPath("."); // quick way of getting current working directory 
    else 
     basePath = GetAbsolutePath(basePath, null); // to be REALLY sure ;) 
    String path; 
    // specific for windows paths starting on \ - they need the drive added to them. 
    // I constructed this piece like this for possible Mono support. 
    if (!Path.IsPathRooted(relativePath) || "\\".Equals(Path.GetPathRoot(relativePath))) 
    { 
     if (relativePath.StartsWith(Path.DirectorySeparatorChar.ToString())) 
      path = Path.Combine(Path.GetPathRoot(basePath), relativePath.TrimStart(Path.DirectorySeparatorChar)); 
     else 
      path = Path.Combine(basePath, relativePath); 
    } 
    else 
     path = relativePath; 
    // resolves any internal "..\" to get the true full path. 
    return Path.GetFullPath(path); 
} 
+0

Mükemmel çözüm, mutlak veya akraba yolunu bir taban yoluna göre birleştirdiği için. Benim düşünceme göre, göreliPath argümanı AbsoluteOrRelativePath olarak yeniden adlandırılmalıdır, çünkü gerçekten temsil ettiği şeydir. Teşekkürler –

+0

Zaten, eğer bu zaten mutlak bir yolsa, bu sadece özel bir durumdur, gerçekten ... işlev hala göreceli yolları çözmeyi amaçlar, lol. Ben sadece burada, hangi parametrelerin hangisi olduğunu açıkça belirtmek için isimlendirdim;) – Nyerguds

+0

@JulioNobre, özellikle buradaki "Path.Combine" ile karşılaştırıldıklarında. Bu kolay bir şekilde düzeltilebilir, ancak bunu sık sık çalışma dizini üzerindeki göreceli yolları çözmek için kullandığımdan ve ilk argümanın garip görünmesiyle null olarak verdiğimden kaçınıyorum. – Nyerguds

İlgili konular