我注意到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 字符:
星号 (*(
问号 (?(
尖括号(<或>(
逗号 (,(
冒号或分号(:或;)
单引号或双引号 (' 或"(
右方括号 (](
双斜杠(//或 \(
或>
希望有帮助。
编辑
设置 Visual Studio 2010 以单步执行 Microsoft .NET 源代码
使用事物帖子,我试图找出当我们使用方法server.MapPath
时.net framwork中实际上发生了什么,在调试.net framwork代码后,我发现调用从虚拟路径获取绝对路径会抛出以下文件和框架方法
文件 -System\Web\httpserverutility.cs\1477467\httpserverutility.cs方法映射路径
文件 -\System\Web\VirtualPath.cs\1477467\VirtualPath.cs*Method*-Create
File -System\Web\HttpRequest.cs\1599819\HttpRequest.cs方法映射路径
但是我发现,对于 strage 行为,当路径为/folder1/folder2/file 时,它会返回 null .cs但在输入/folder1/文件夹 2/file 时返回 reutn null 对象.cs
我希望你喜欢踏入框架,看看有什么好玩的。
任何方式好问题..但是这个问题的提出者可能只有微软的人才会在Framewok中设计该文件。
问题是它无法找到带有g空间的文件夹,即"文件夹2"无效,并且无法在文件系统上找到此文件夹。
基本上,您在Windows文件系统上找不到任何在末尾或开头namei.e之后具有sapce的文件夹。