2008-08-06 16 views
56

Wenn ich es geschafft habe, die Existenz einer Datei mit Server.MapPath zu finden und zu überprüfen, und ich möchte den Benutzer jetzt direkt an diese Datei senden, was ist die schnellste Art zu konvertieren dieser absolute Pfad zurück in einen relativen Web-Pfad?Absoluter Pfad zurück zum web-relativen Pfad

+5

Diese Frage ist zwei Jahre alt, die Möglichkeit, Kommentare damals noch nicht existierte posten. "MEINE GÜTE". – tags2k

Antwort

47

dies könnte vielleicht funktionieren:

String RelativePath = AbsolutePath.Replace(Request.ServerVariables["APPL_PHYSICAL_PATH"], String.Empty); 

(ich bin C# verwenden, aber zu vb angepasst werden könnte)

(@ Tags2k: Ich habe die oben genannte Antwort editierte)

+0

Dies funktioniert nur im Rahmen einer Anfrage. – bzlm

+2

@ [GateKiller] (http://stackoverflow.com/questions/3164?sort=oldest#3218): Beachten Sie, dass Ihre Lösung fehlschlagen kann, wenn Sie auf Ihrer Website IIS Virtual Directories verwenden, da der physische Pfad der Anwendung davon abweichen kann der physische Pfad der Datei. – Costo

2

Wenn Sie Server.MapPath verwendet haben, sollten Sie bereits den relativen Webpfad haben. Gemäß der MSDN documentation nimmt diese Methode eine Variable Pfad, die den virtuellen Pfad des Webservers ist. Wenn Sie also die Methode aufrufen konnten, sollten Sie den relativen Webpfad bereits sofort verfügbar haben.

+0

Dies ist nicht unbedingt wahr - der MapPath-Aufruf könnte durch eine andere Methode ausgeführt und an meine File-Checker-Methode übergeben bzw. von dort aufgerufen werden (oder in meinem Fall) aus einer Reihe verschiedener Elemente, von denen eines mein Resources-Verzeichnis ist (definiert als "~/__ Ressourcen"). Offensichtlich führt das Anweisen des Benutzers zu diesem Pfad zu unerwarteten Ergebnissen. Dies wäre auch nützlich, um zu wissen, dass manchmal der absolute Dateipfad mit keiner anderen kontextuellen Information aus der Datenbank herausgezogen wurde. – tags2k

+0

[@tagsk] (http://stackoverflow.com/questions/3164#3195) - Ich weiß nicht darüber. Wenn die in Server.MapPath eingegebene Zeichenfolge gültig ist und einen physischen Serverpfad zurückgibt, muss dies übrigens auch ein gültiger virtueller Pfad sein, unabhängig davon, wie Sie die Methode erstellt haben. Informationen zur Verwendung der Tilde (~) am Anfang einer virtuellen Adresse finden Sie in diesem MSDN-Artikel zu [ASP.NET-Websitepfade] (http://msdn.microsoft.com/en-us/library/ms178116.aspx). :> ASP.NET enthält die Webanwendung > root-Operator (~), die Sie verwenden können > beim Angeben eines Pfades im Server > c –

+2

Yaakov - Nicht so. Zum Beispiel nimmt eine Funktion, die ich verwende, einen Root-Pfad und gibt eine 'IEnumerable '-Sammlung rekursiv zurück. In meiner Webanwendung kann ich diesen Pfad angeben, der meinen relativen Pfad zu einem physischen Pfad auflöst, aber wenn ich diese rekursive Liste zurückbekomme und sie relativen Pfaden in meiner Anwendung zuordnen möchte, habe ich diese Informationen nicht. –

33

Wäre es nicht nett zu haben Server.RelativePath (Pfad)?

gut, man muss nur verlängern es ;-)

public static class ExtensionMethods 
{ 
    public static string RelativePath(this HttpServerUtility srv, string path, HttpRequest context) 
    { 
     return path.Replace(context.ServerVariables["APPL_PHYSICAL_PATH"], "~/").Replace(@"\", "/"); 
    } 
} 

dies mit Ihnen einfach

nennen
Server.RelativePath(path, Request); 
+3

ein besserer Ersatz für den physischen Pfad wäre ~ /. path.Replace (context.ServerVariables ("APPL_PHYSICAL_PATH"), "~ /") –

11

Ich weiß, das ist alt, aber ich brauchte für virtuelle Verzeichnisse zu berücksichtigen (pro @ Costos Kommentar). Dies scheint zu helfen:

static string RelativeFromAbsolutePath(string path) 
{ 
    if(HttpContext.Current != null) 
    { 
     var request = HttpContext.Current.Request; 
     var applicationPath = request.PhysicalApplicationPath; 
     var virtualDir = request.ApplicationPath; 
     virtualDir = virtualDir == "/" ? virtualDir : (virtualDir + "/"); 
     return path.Replace(applicationPath, virtualDir).Replace(@"\", "/"); 
    } 

    throw new InvalidOperationException("We can only map an absolute back to a relative path if an HttpContext is available."); 
} 
4

Ich mag die Idee von Canoas. Leider hatte ich "HttpContext.Current.Request" nicht verfügbar (BundleConfig.cs).

änderte ich die Methode wie folgt aus:

public static string RelativePath(this HttpServerUtility srv, string path) 
{ 
    return path.Replace(HttpContext.Current.Server.MapPath("~/"), "~/").Replace(@"\", "/"); 
} 
Verwandte Themen