2009-11-19 32 views
24

Bunu yapmak için yerleşik bir .NET yöntemi olduğunu umuyorum, ancak bulamıyorum.Bir yoldan diğerine nasıl göreli bir yol elde edebilirim C#

Aynı kök sürücüde olduğunu bildiğim iki yol var, birinden diğerine göreli bir yol elde edebilmek istiyorum.

string path1 = @"c:\dir1\dir2\"; 
string path2 = @"c:\dir1\dir3\file1.txt"; 
string relPath = MysteryFunctionThatShouldExist(path1, path2); 
// relPath == "..\dir3\file1.txt" 

Bu işlev var mı? Değilse, onu uygulamak için en iyi yol ne olurdu?

cevap

47

Uri çalışır:

Uri path1 = new Uri(@"c:\dir1\dir2\"); 
Uri path2 = new Uri(@"c:\dir1\dir3\file1.txt"); 
Uri diff = path1.MakeRelativeUri(path2); 
string relPath = diff.OriginalString; 
+1

Uri çalışır ancak düzeltmek için yeterince kolay olan eğik çizgi iletmek geçer. Teşekkürler! –

9

Ayrıca PathRelativePathTo fonksiyonunu içe ve diyebiliriz.

ör .:

using System.Runtime.InteropServices; 

public static class Util 
{ 
    [DllImport("shlwapi.dll", EntryPoint = "PathRelativePathTo")] 
    protected static extern bool PathRelativePathTo(StringBuilder lpszDst, 
     string from, UInt32 attrFrom, 
     string to, UInt32 attrTo); 

    public static string GetRelativePath(string from, string to) 
    { 
    StringBuilder builder = new StringBuilder(1024); 
    bool result = PathRelativePathTo(builder, from, 0, to, 0); 
    return builder.ToString(); 
    } 
} 
+0

Benim için çalışıyor, ancak "korumalı" kaldırmak zorunda kaldı, aksi halde (VS2012, .NET3.5 ile) Ben hata CS1057 olsun: "PathRelativePathTo (System.Text.StringBuilder, string, uint, string, uint)": Statik sınıflar korumalı üyeler içeremez " –

+0

Win32 API'sini içe aktarma gibi basit bir durum için içe aktarma, mümkün olduğunu bilmek güzel olsa da. – FacelessPanda

+0

@FacelessPanda Zorlukla aşırı derecede zorlanıyor - kütüphane neredeyse sıfır yüklendi, böylece sıfır yükü kaldı. –

İlgili konular