2009-11-19 10 views
24

Spero ci sia un metodo integrato in .NET per farlo, ma non lo trovo.Come ottengo un percorso relativo da un percorso all'altro in C#

Ho due percorsi che so essere sullo stesso drive root, voglio essere in grado di ottenere un percorso relativo da uno all'altro.

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

Esiste questa funzione? Se no, quale sarebbe il modo migliore per implementarlo?

risposta

47

Uri opere:

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 funziona, ma passa in barre, che è abbastanza facile da risolvere. Grazie! –

9

si potrebbe anche importare la funzione PathRelativePathTo e chiamarla.

es .:

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

Funziona per me, ma ho dovuto rimuovere il "protetto", altrimenti (con VS2012, .NET3.5) ottengo l'errore CS1057: "PathRelativePathTo (System.Text.StringBuilder, string, uint, string, uint) ': le classi statiche non possono contenere membri protetti " –

+0

L'importazione dell'API win32 per un caso semplice come quello sembra esagerare, anche se è bello sapere che è possibile. – FacelessPanda

+0

@FacelessPanda Difficilmente lo strafare - la libreria è quasi certamente caricata comunque, quindi l'utilizzo di esso non ha costi generali. –

Problemi correlati