Server.MapPath e espaços
-
11-12-2019 - |
Pergunta
Notei algo estranho em Server.MapPath().Se eu tiver uma pasta com um espaço no final, recebo:
HttpException:Falha ao mapear o caminho.
Isso funciona bem:Server.MapPath("/Folder1/Folder2/item.jpg")
Isso funciona bem:Server.MapPath("/Folder1/ Folder2/item.jpg")
Isso funciona bem:Server.MapPath("/Folder1/Fol der2/item.jpg")
Isso falha!:Server.MapPath("/Folder1/Folder2 /item.jpg")
Alguém poderia me explicar por que um espaço no final falha enquanto um espaço em qualquer outro lugar não?
Observação: Nenhuma das pastas existe.
Solução
Porque você não deveria:
Não termine um nome de arquivo ou diretório com um espaço ou ponto final.Embora o sistema de arquivos subjacente possa oferecer suporte a esses nomes, o shell do Windows e a interface do usuário não oferecem.No entanto, é aceitável especificar um ponto final como o primeiro caractere de um nome.Por exemplo, ".temp".
A questão vem do método FileUtil.IsSuspiciousPhysicalPath(string physicalPath, out bool pathTooLong)
, que faz uma comparação:
string.Compare(physicalPath, Path.GetFullPath(physicalPath), StringComparison.OrdinalIgnoreCase) != 0;
Path.GetFullPath()
cortará os espaços finais dos nomes de diretórios e arquivos (porque chama Path.NormalizePath()
que faz isso), que pode ser descoberto chamando Path.GetFullPath(@"C:\Foo \Bar.txt")
por exemplo.Como isso não corresponderá ao caminho original que contém os espaços, o método retornará true
identificando assim o caminho como suspeito, após o que Server.MapPath
lançará a exceção.
Outras dicas
O método MapPath mapeia o caminho relativo ou virtual especificado para o diretório físico correspondente no servidor.O método não verifica se o caminho retornado é válido ou existe no servidor.Você deve usar o método Directory.Exists() ou File.Exists() para verificar se o diretório ou arquivo já existe.
if (File.Exists(Server.MapPath(file))
Além disso, saiba também a seguir os caracteres inválidos para o método:
Asterisco (*)
Ponto de interrogação (?)
Colchetes angulares (< ou >)
Vírgula (,)
Dois pontos ou ponto e vírgula (:ou ;)
Aspas simples ou aspas duplas (' ou ")
Colchete direito (])
Barras duplas (// ou \)
Espero que ajude.
EDITAR
Configurando o Visual Studio 2010 para entrar no código-fonte do Microsoft .NET
Usando o post, tentei descobrir o que realmente está acontecendo no .net framwork quando usamos o método server.MapPath
depois de depurar o código do framework .net, descobri chamadas para obter o caminho absoluto do caminho virtual, lançando os seguintes arquivos e métodos do framework
Arquivo - System web httpServerutility.cs 1477467 httpServerutility.csMétodo-MapPath
Arquivo - System web virtualPath.cs 1477467 virtualPath.cs*Método*-Criar
Arquivo -Sistema\Web\HttpRequest.cs\1599819\HttpRequest.csMétodo-MapPath
Mas descobri que, com o comportamento estranho, ele me retorna nulo quando o caminho é /folder1/folder2 /file.cs, mas não reutn objeto nulo ao inserir /folder1/folder2/file.cs
Espero que você goste de entrar no framework e ver o que acontece
De qualquer forma, uma boa pergunta ... mas ainda assim a resposta a esta pergunta pode ser dada apenas por pessoas da Microsoft que projetam esses arquivos no framewok
O problema é que não é possível localizar a pasta com espaço, ou seja, "Pasta2". Não é válido e não é possível localizar esta pasta no sistema de arquivos.
Basicamente, você não encontra nenhuma pasta no sistema de arquivos do Windows que tenha espaço após o nome, ou seja, no final ou no início.