我在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")
有人可以向我解释为什么最后的空间会失败,而其他地方的空间却没有?
注意:没有文件夹存在。
答案 0 :(得分:2)
MapPath方法将指定的相对或虚拟路径映射到服务器上的相应物理目录。该方法不检查它返回的路径是有效还是存在于服务器上。您必须使用Directory.Exists()或File.Exists()方法来检查目录或文件是否已存在。
if (File.Exists(Server.MapPath(file))
此外,还知道以下是该方法的invlid字符:
星号(*)
问号(?)
角括号(<或>)
逗号(,)
结肠或分号(:或;)
单引号或双引号('或“)
右方括号(])
双斜杠(//或\)
希望有所帮助。
答案 1 :(得分:2)
因为你shouldn't:
不要使用空格或句点结束文件或目录名称。虽然底层文件系统可能支持此类名称,但Windows shell和用户界面却不支持。但是,可以将句点指定为名称的第一个字符。例如,“。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
将抛出异常。
答案 2 :(得分:1)
Setting up Visual Studio 2010 to step into Microsoft .NET Source Code
使用post post我尝试在调试.net框架代码后使用方法server.MapPath
时找出实际上正在使用.net框架的内容我发现调用从虚拟路径获取绝对路径抛出以下文件和框架方法
档案 - SYSTEM \网络\ httpserverutility.cs \ 1477467 \ httpserverutility.cs 的方法强> -MapPath
档案 - \ SYSTEM \网络\ VirtualPath.cs \ 1477467个\ VirtualPath.cs *的方法的* - 创建
文件 -System \ Web \ HttpRequest.cs \ 1599819 \ HttpRequest.cs 的方法强> -MapPath
但是我发现,当存在/ folder1 / folder2 /file.cs时,当存在路径为/ folder1 / folder2 /file.cs时,它返回null,而当输入/ folder1 / folder2 / file.cs
时,它不会返回null对象我喜欢你跳进框架,看看有什么感觉
任何方式都是好问题..但是这个问题的回答可能只有那些只在framewok中设计文件的微软人员提供
问题是它无法找到文件夹withg空间,即“Folder2”。无效且无法在文件系统上找到此文件夹。
基本上你没有在Windows文件系统上找到任何文件夹,这些文件夹在名称结尾或开头后有sapce。