Absoluter Pfad zurück zum Web-relativen Pfad

stimmen
58

Wenn ich es geschaffen habe , ausfindig zu machen und die Existenz einer Datei mit Server.MapPath zu überprüfen und ich mag nun auf diese Datei die Benutzer direkt senden, was ist der schnellste Weg, um den absoluten Weg zurück in eine relative Bahnweg zu konvertieren?

Veröffentlicht am 06/08/2008 um 09:34
quelle vom benutzer
In anderen Sprachen...                            


6 antworten

stimmen
49

dies könnte vielleicht funktionieren:

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

Ich bin mit # c könnte aber vb angepasst werden.

Beantwortet am 06/08/2008 um 10:28
quelle vom benutzer

stimmen
34

Wäre es nicht schön haben Server.RelativePath (Pfad) ?

na ja, müssen Sie nur um es zu verlängern ;-)

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

Mit diesem können Sie einfach anrufen

Server.RelativePath(path, Request);
Beantwortet am 07/03/2011 um 18:27
quelle vom benutzer

stimmen
12

Ich weiß, das ist alt, aber ich brauchte für virtuelle Verzeichnisse zu berücksichtigen (pro @ Costo 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.");
}
Beantwortet am 05/05/2012 um 15:05
quelle vom benutzer

stimmen
4

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

Ich habe die Methode wie folgt aus:

public static string RelativePath(this HttpServerUtility srv, string path)
{
     return path.Replace(HttpContext.Current.Server.MapPath("~/"), "~/").Replace(@"\", "/");
}
Beantwortet am 24/06/2015 um 08:19
quelle vom benutzer

stimmen
2

Wenn Sie Server.MapPath verwenden, dann sollten Sie bereits den relativen Bahnweg haben. Gemäß der MSDN - Dokumentation , nimmt diese Methode eine Variable, Pfad , der der virtuelle Pfad des Web - Servers ist. Also , wenn Sie in der Lage waren , die Methode zu nennen, sollten Sie bereits die relative Bahnweg sofort zugänglich.

Beantwortet am 06/08/2008 um 09:44
quelle vom benutzer

stimmen
0

Für asp.net Kern schrieb i Hilfsklasse pathes in beiden Richtungen zu erhalten.

public class FilePathHelper
{
    private readonly IHostingEnvironment _env;
    public FilePathHelper(IHostingEnvironment env)
    {
        _env = env;
    }
    public string GetVirtualPath(string physicalPath)
    {
        if (physicalPath == null) throw new ArgumentException("physicalPath is null");
        if (!File.Exists(physicalPath)) throw new FileNotFoundException(physicalPath + " doesn't exists");
        var lastWord = _env.WebRootPath.Split("\\").Last();
        int relativePathIndex = physicalPath.IndexOf(lastWord) + lastWord.Length;
        var relativePath = physicalPath.Substring(relativePathIndex);
        return $"/{ relativePath.TrimStart('\\').Replace('\\', '/')}";
    }
    public string GetPhysicalPath(string relativepath)
    {
        if (relativepath == null) throw new ArgumentException("relativepath is null");
        var fileInfo = _env.WebRootFileProvider.GetFileInfo(relativepath);
        if (fileInfo.Exists) return fileInfo.PhysicalPath;
        else throw new FileNotFoundException("file doesn't exists");
    }

von Regler oder Service injizieren FilePathHelper und Verwendung:

var physicalPath = _fp.GetPhysicalPath("/img/banners/abro.png");

und kehrt

var virtualPath = _fp.GetVirtualPath(physicalPath);
Beantwortet am 19/12/2018 um 11:40
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more