Eine Funktion, die oft verwendet wird, aber ich habe im Internet noch nie eine relevante Lösung gefunden. Heute habe ich die Gelegenheit genutzt, den absoluten Pfad in einen virtuellen Pfad umzuwandeln und ihn zu kapseln Pfad relativ zur angegebenen Seite
/**//// <Zusammenfassung>
/// Konvertieren Sie den absoluten Pfad unter der Website in einen virtuellen Pfad relativ zur angegebenen Seite
/// </summary>
/// <param name="page">Aktueller Seitenzeiger, normalerweise dieser</param>
/// <param name="specifiedPath">Absoluter Pfad</param>
/// <returns>Virtueller Pfad, Typ: ../../</returns>
öffentliche statische Zeichenfolge ConvertSpecifiedPathToRelativePathForPage(Seitenseite, Zeichenfolge angegebenerPath)
{
//Virtueller Pfad des Stammverzeichnisses
string virtualPath = page.Request.ApplicationPath;
//Absoluter Pfad zum Stammverzeichnis
string pathRooted = HostingEnvironment.MapPath(virtualPath);
//Virtueller Seitenpfad
string pageVirtualPath = page.Request.Path;
if (!Path.IsPathRooted(specifiedPath) || selectedPath.IndexOf(pathRooted) == -1)
{
throw new Exception(string.Format(""{0}"ist ein virtueller Pfad, kein absoluter Pfad!", angegebenerPath));
}
// In relativen Pfad konvertieren
//(Der Test ergab, dass pathRooted unterschiedlich zu sein scheint, wenn es auf dem mit VS2005 gelieferten Server und im Stammverzeichnis oder virtuellen Verzeichnis unter IIS ausgeführt wird.
// An manchen Stellen wird ein „“ hinzugefügt, an manchen nicht. Treffen Sie einfach ein Urteil, um auf der sicheren Seite zu sein.)
if (pathRooted.Substring(pathRooted.Length - 1, 1) == "\")
{
angegebenerPath = angegebenerPath.Replace(pathRooted, "/");
}
anders
{
angegebenerPath = angegebenerPath.Replace(pathRooted, "");
}
string relativePath = selectedPath.Replace("\", "/");
string[] pageNodes = pageVirtualPath.Split('/');
// Subtrahiere die letzte Seite und den vorherigen ""-Wert
int pageNodesCount = pageNodes.Length - 2;
for (int i = 0; i < pageNodesCount; i++)
{
relativePath = "/.." + relativePath;
}
if (pageNodesCount > 0)
{
// Wenn „..“ vorhanden ist, entfernen Sie das führende „/“
relativePath = relativePath.Substring(1, relativePath.Length - 1);
}
return relativPath;
}
Die zweite Methode wird offensichtlich aus dem ersten Teil der ersten Methode extrahiert, daher bin ich zu faul, relevante Kommentare hinzuzufügen :P
Konvertieren Sie den absoluten Pfad unter der Website in einen virtuellen Pfad
/**//// <Zusammenfassung>
/// Konvertieren Sie den absoluten Pfad unter der Website in einen virtuellen Pfad
/// Hinweis: Diejenigen unter Nicht-Websites werden nicht konvertiert.
/// </summary>
/// <param name="page">Aktueller Seitenzeiger, normalerweise dieser</param>
/// <param name="specifiedPath">Absoluter Pfad</param>
/// <returns>Virtueller Pfad, Typ: ~/</returns>
öffentliche statische Zeichenfolge ConvertSpecifiedPathToRelativePath(Seitenseite, Zeichenfolge angegebenerPath)
{
string virtualPath = page.Request.ApplicationPath;
string pathRooted = HostingEnvironment.MapPath(virtualPath);
if (!Path.IsPathRooted(specifiedPath) || selectedPath.IndexOf(pathRooted) == -1)
{
return angegebenenPath;
}
if (pathRooted.Substring(pathRooted.Length - 1, 1) == "\")
{
angegebenerPath = angegebenerPath.Replace(pathRooted, "~/");
}
anders
{
angegebenerPath = angegebenerPath.Replace(pathRooted, "~");
}
string relativePath = angegebenerPath.Replace("\", "/");
return relativePath;
}
Zur Konvertierung eines virtuellen Pfads in einen absoluten Pfad gibt es nichts zu sagen. Die Methode HttpRequest.MapPath ist speziell dafür konzipiert.