5

我注意到 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")

有人可以向我解释为什么最后的空格会失败,而其他任何地方的空格都不会吗?

注意:这些文件夹都不存在。

4

3 回答 3

2

MapPath 方法将指定的相对或虚拟路径映射到服务器上相应的物理目录。该方法不检查它返回的路径是否有效或是否存在于服务器上。您必须使用 Directory.Exists() 或 File.Exists() 方法来检查目录或文件是否已经存在。

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

此外,还知道以下是该方法的无效字符:

星号 (*)
问号 (?)
尖括号 (< 或 >)
逗号 (,)
冒号或分号 (: 或 ;)
单引号或双引号 (' 或 ")
右方括号 (])
双斜杠(// 或者 \)

希望有帮助。

于 2012-07-26T08:38:30.090 回答
2

因为你不应该

不要以空格或句点结尾的文件或目录名称。尽管底层文件系统可能支持此类名称,但 Windows shell 和用户界面不支持。但是,可以将句点指定为名称的第一个字符。例如,“.temp”。

问题来自方法FileUtil.IsSuspiciousPhysicalPath(string physicalPath, out bool pathTooLong),它进行了比较:

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

Path.GetFullPath()将从目录和文件名中修剪尾随空格(因为它调用Path.NormalizePath()which 这样做),例如可以发现调用Path.GetFullPath(@"C:\Foo \Bar.txt")。由于这与包含空格的原始路径不匹配,因此该方法将返回,true从而将路径识别为可疑,之后Server.MapPath将引发异常。

于 2012-07-26T13:33:19.037 回答
1

编辑

设置 Visual Studio 2010 以进入 Microsoft .NET 源代码

使用事情后,我试图找出server.MapPath在调试.net框架代码后使用方法时.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 而不是 reutn null 对象时,当输入 /folder1/folder2/file.cs

我希望你喜欢进入框架,看看会发生什么

任何方式都很好的问题..但这个问题的答案仍然可能由微软人提供,只有在框架中设计该文件的人


问题是它无法找到带有空间的文件夹,即“Folder2”。无效并且无法在文件系统上找到此文件夹。

基本上,您在 Windows 文件系统上找不到任何文件夹,该文件夹在 namei.e 末尾或开头后有 sapce。

于 2012-07-26T08:23:47.510 回答