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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top