Frage

Mir ist etwas Seltsames in Server.MapPath() aufgefallen.Wenn ich einen Ordner mit einem Leerzeichen am Ende habe, erhalte ich Folgendes:

HttpException:Der Pfad konnte nicht zugeordnet werden.

Das funktioniert gut:Server.MapPath("/Folder1/Folder2/item.jpg")

Das funktioniert gut:Server.MapPath("/Folder1/ Folder2/item.jpg")

Das funktioniert gut:Server.MapPath("/Folder1/Fol der2/item.jpg")

Das schlägt fehl!:Server.MapPath("/Folder1/Folder2 /item.jpg")

Könnte mir jemand erklären, warum ein Leerzeichen am Ende fehlschlägt, während ein Leerzeichen an einer anderen Stelle nicht funktioniert?

Notiz: Keiner der Ordner existiert.

War es hilfreich?

Lösung

Wegen dir sollte nicht:

Beenden Sie einen Datei- oder Verzeichnisnamen nicht mit einem Leerzeichen oder einem Punkt.Obwohl das zugrunde liegende Dateisystem solche Namen möglicherweise unterstützt, ist dies bei der Windows-Shell und der Benutzeroberfläche nicht der Fall.Es ist jedoch akzeptabel, einen Punkt als erstes Zeichen eines Namens anzugeben.Beispiel: „.temp“.

Das Problem liegt in der Methode FileUtil.IsSuspiciousPhysicalPath(string physicalPath, out bool pathTooLong), was einen Vergleich durchführt:

string.Compare(physicalPath, Path.GetFullPath(physicalPath), StringComparison.OrdinalIgnoreCase) != 0;

Path.GetFullPath() schneidet nachgestellte Leerzeichen aus Verzeichnis- und Dateinamen ab (weil es aufruft Path.NormalizePath() was dies tut), das beim Aufrufen entdeckt werden kann Path.GetFullPath(@"C:\Foo \Bar.txt") Zum Beispiel.Da dieser nicht mit dem ursprünglichen Pfad übereinstimmt, der die Leerzeichen enthält, wird die Methode zurückgegeben true Dadurch wird der Pfad als verdächtig identifiziert Server.MapPath wird die Ausnahme auslösen.

Andere Tipps

Die MapPath-Methode ordnet den angegebenen relativen oder virtuellen Pfad dem entsprechenden physischen Verzeichnis auf dem Server zu.Die Methode prüft nicht, ob der zurückgegebene Pfad gültig ist oder auf dem Server vorhanden ist.Sie müssen die Methode Directory.Exists() oder File.Exists() verwenden, um zu überprüfen, ob ein Verzeichnis oder eine Datei bereits vorhanden ist.

if (File.Exists(Server.MapPath(file)) 

Darüber hinaus sind auch die folgenden ungültigen Zeichen für die Methode bekannt:

Sternchen (*)
Fragezeichen (?)
Spitze Klammern (< oder >)
Komma (,)
Doppelpunkt oder Semikolon (:oder ;)
Einfaches oder doppeltes Anführungszeichen (' oder ")
Rechte eckige Klammer (])
Doppelte Schrägstriche (// oder \)

Hoffentlich hilft das.

BEARBEITEN

Einrichten von Visual Studio 2010 für den Einstieg in den Microsoft .NET-Quellcode

Mithilfe von Thing Post habe ich versucht herauszufinden, was tatsächlich im .net-Framework passiert, wenn wir die Methode verwenden server.MapPath Nach dem Debuggen des .net-Framework-Codes habe ich herausgefunden, dass Aufrufe zum Abrufen des absoluten Pfads vom virtuellen Pfad die folgenden Dateien und Methoden des Frameworks auslösen

Datei - System Web httpserverutility.cs 1477467 httpserverutility.csMethode-MapPath

Datei - System Web virtualPath.cs 1477467 virtualPath.cs*Methode*-Erstellen

Datei -System\Web\HttpRequest.cs\1599819\HttpRequest.csMethode-MapPath

Aber ich habe festgestellt, dass mir das Strage-Verhalten Null zurückgibt, wenn der Pfad /Ordner1/Ordner2/Datei.cs ist, aber kein Null-Objekt, wenn ich /Ordner1/Ordner2/Datei.cs eingebe

Ich hoffe, es gefällt Ihnen, in den Rahmen zu treten und zu sehen, was passiert

Auf jeden Fall eine gute Frage. Die Antwort auf diese Frage wird jedoch möglicherweise nur von Microsoft-Leuten gegeben, die diese Dateien in Framewok entwerfen


Das Problem besteht darin, dass der Ordner mit Speicherplatz, z. B. „Ordner2“, nicht gefunden werden kann. Dieser Ordner ist nicht gültig und kann im Dateisystem nicht gefunden werden.

Grundsätzlich finden Sie im Windows-Dateisystem keinen Ordner, der nach namei.e am Ende oder am Anfang ein Sapce enthält.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top