Вопрос

Я заметил что-то странное в Server.MapPath().Если у меня есть папка с пробелом в конце, я получаю:

HttpException:Не удалось сопоставить путь.

Это отлично работает:Server.MapPath("/Folder1/Folder2/item.jpg")

Это отлично работает:Server.MapPath("/Folder1/ Folder2/item.jpg")

Это отлично работает:Server.MapPath("/Folder1/Fol der2/item.jpg")

Это не получается!:Server.MapPath("/Folder1/Folder2 /item.jpg")

Может ли кто-нибудь объяснить мне, почему пробел в конце не работает, а пробел где-либо еще - нет?

Примечание: Ни одна из папок не существует.

Это было полезно?

Решение

Потому что ты не должен:

Не заканчивайте имя файла или каталога пробелом или точкой.Хотя базовая файловая система может поддерживать такие имена, оболочка Windows и пользовательский интерфейс этого не поддерживают.Однако допускается указывать точку в качестве первого символа имени.Например, «.temp».

Проблема возникает из-за метода FileUtil.IsSuspiciousPhysicalPath(string physicalPath, out bool pathTooLong), который выполняет сравнение:

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

Path.GetFullPath() будет обрезать конечные пробелы в именах каталогов и файлов (поскольку он вызывает Path.NormalizePath() который делает это), который можно обнаружить, вызвав Path.GetFullPath(@"C:\Foo \Bar.txt") например.Поскольку это не будет соответствовать исходному пути, содержащему пробелы, метод вернет true таким образом идентифицируя путь как подозрительный, после чего Server.MapPath выкинет исключение.

Другие советы

Метод MapPath отображает указанный относительный или виртуальный путь к соответствующему физическому каталогу на сервере.Метод не проверяет, является ли путь возвращается, является ли действительным или существует на сервере.Вы должны использовать метод directory.exists () или file.exists (), чтобы проверить, существует ли каталог или файл.

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

Кроме того, также знают, что используются символы Invlid для метода:

Asterisk (*)


Вопросительный знак (?)


Угольные скобки (<или>)
Запятая (,)

Толкование или полутока (: или;)

Одноцитальная или двойная цитата ('или ")
Правый квадратный кронштейн (])


Двойные косые (// или \)

Надеюсь, что помогает.

РЕДАКТИРОВАТЬ

Настройка Visual Studio 2010 для доступа к исходному коду Microsoft .NET

Используя пост, я попытался выяснить, что на самом деле происходит в .net-фреймворке, когда мы используем метод server.MapPath после отладки кода платформы .net я обнаружил вызовы для получения абсолютного пути из виртуального пути, которые перебрасывают следующие файлы и методы платформы.

Файл - System web httpserverutility.cs 1477467 httpserverutility.csМетод-MapPath

Файл - system web virtualpath.cs 1477467 virtualpath.cs*Метод*-Создавать

Файл -System\Web\HttpRequest.cs\1599819\HttpRequest.csМетод-MapPath

Но я обнаружил, что при странном поведении он возвращает мне ноль, когда путь равен /folder1/folder2/file.cs, но не возвращает нулевой объект при вводе /folder1/folder2/file.cs

Надеюсь, вам понравится заглянуть в рамки и посмотреть, что произойдет.

В любом случае хороший вопрос... но тем не менее ответ на этот вопрос могут дать только люди из Microsoft, которые разрабатывают эти файлы во фреймворке.


Проблема в том, что невозможно найти папку с пространством, т. е. «Папка 2». Недействительна и не может найти эту папку в файловой системе.

По сути, вы не найдете ни одной папки в файловой системе Windows, которая имела бы пробел после namei.e в конце или начале.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top