2010-11-01 10 views

risposta

10
Non

certo se c'è un modo migliore, ma questo funzionerà:

var file1 = @"c:\temp1\adam\"; 
var file2 = @"c:\temp1\jamie\"; 

var result = new Uri(file1) 
    .MakeRelativeUri(new Uri(file2)) 
    .ToString() 
    .Replace("/", "\\"); 
2

questo è semplice. Passi:

  1. Rimuovere inizio comune di stringa (c:\temp1\)
  2. numero Conte di directory di primo percorso (1 nel tuo caso)
  3. sostituirli con ..
  4. Aggiungi secondo percorso
+2

ma non conosci il prefisso comune! (passaggio 1) –

+1

Trovare il prefisso comune di due stringhe non è difficile. Il problema sta nei dettagli. Entrambi/e \ sono separatori di percorso, alcuni filesystem sono case-insensitive, altri sono case-sensitive, un percorso può contenere. o .. e probabilmente molti altri problemi. D'altra parte sottovalutare la parte comune non è un grosso problema. – CodesInChaos

+0

@Mitch Wheat ho pensato che fosse ovvio – Andrey

2

Aggiornato: dal momento che il costruttore è ormai obsoleto è possibile utilizzare:

Uri.UnescapeDataString(new Uri(file1).MakeRelativeUri(new Uri(file2)).ToString()) 
    .Replace("/", "\\"); 

vecchia versione:

idea di Kirk Woll è buona, ma è necessario per assicurare il vostro percorso non ottiene straziati (per esempio spazi sostituiti da% 20) dicendo a Uri di non sfuggire al tuo percorso:

var result = new Uri(file1, true) 
    .MakeRelativeUri(new Uri(file2, true)) 
    .ToString() 
    .Replace("/", "\\"); 
+0

Hmm, ho pensato che fosse un buon punto, ma si dice che quel costruttore sia considerato obsoleto e genererà un avvertimento sul compilatore. Durante i miei test, non ho avuto problemi con i caratteri di escape. Mi chiedo quali personaggi sono stati scappati per te? –

+0

@ Kirk Woll, ho avuto problemi con gli spazi nel nome. – laktak

+0

Ah, duh, mi dispiace, non mi ero reso conto che l'avessi detto. Grazie per la risposta. –

Problemi correlati