Pergunta

Eu estou olhando para o manuseio de arquivo mais caminhos no meu aplicativo do windows.

Atualmente, eu tenho uma caixa de texto (caixa de edição), em que um usuário pode digitar um caminho de arquivo absoluto.Eu, então, leia o que escreveu o caminho do arquivo, usando GetWindowText, em uma seqüência de caracteres declarado assim: TCHAR FilePath[MAX_PATH];

Obviamente, aqui estou confiando no MAX_PATH constante que limita me para 260 caracteres.Então, para lidar de arquivo mais/caminhos de nomes que eu poderia basta estender a minha TCHAR matriz assim: TCHAR FilePath[32767];.

Ou há um caminho melhor?Eu poderia usar uma matriz de comprimento variável?(TCHAR FilePath[]; isso é mesmo possível em C++?- desculpe, eu sou muito novo para isso).

Obrigado em avançado!


Aqui está todo o trecho de código que eu mencionei acima:

TCHAR FilePath[MAX_PATH];
ZeroMemory(&FilePath, sizeof(FilePath));
GetWindowText(hWndFilePath, FilePath, MAX_PATH);
Foi útil?

Solução

Há uma série de limitações com relação aos caminhos de arquivo no Windows.Por padrão, os caminhos não pode ser mais de 260 caracteres, que é o que o MAX_PATH constante é para.

No entanto, você pode acesso a caminhos mais longos - com algumas limitações prefixando-se a caminho com "\\?\".No entanto, as limitações de usar o "\\?\" prefixo geralmente supera o benefício:

  1. Há uma série de APIs do Win32 que não suportam caminhos com este prefixo (por exemplo, LoadLibrary sempre falhará em um caminho que é mais de 260 caracteres)
  2. O Win32 Canonização regras não terão efeito quando usar o "\\?\" prefixo.Por exemplo, por padrão, "/" em caminhos é convertido para "\", "." e ".." são convertidas em referências para a atual e diretórios pai, respectivamente, e assim por diante:nada disso acontece quando você usar o "\\?\" prefixo.
  3. Só porque você pode modificar o seu programa de apoio caminhos mais longos, outros programas podem não conseguir abrir os ficheiros criados por você.Este será o caso se os outros programas não também usar o "\\?\" prefixo.

Para ser honesto, do ponto #2 é o verdadeiro assassino:você se abre para todos os tipos de problemas quando utilizar o "\\?\" prefixo e você basicamente tem que re-implementar o Win32 canonização regras a si mesmo se você ir por esse caminho.

Portanto, minha recomendação é ficar com o 260 limitação.Pelo menos até que haja melhor plataforma de suporte para caminhos mais longos.

Outras dicas

Depende de que tipo de programa que você está escrevendo.Minha própria estratégia tem sido geralmente para restringir caminho criação especificados em MAX_PATH de comprimento, mas ser capaz de ler existente dados de caminhos mais longos (usando o "\\?\" prefixo Reitor menciona em sua resposta).Há exceções ao que, embora-por exemplo, um programa de backup deve aceitar longos caminhos, e deve reproduzir exatamente o que ele foi dado como entrada.

Enquanto Dean está certamente correto que o Windows não canoniza caminhos mais longos para você, eu tenho não descobri que isso é muito de uma preocupação, como uma regra geral.Isso geralmente não significa escrever o seu próprio código para canonizar o caminho -- que, geralmente, significa que o usuário digitar caminhos de uma forma que simplesmente não gerar tais coisas em primeiro lugar.

Não, porque se você tem um caminho mais longo, o Windows não pode aceitá-lo.Assim, embora tecnicamente, você pode segurar mais caracteres do que em seu buffer, você nunca pode realmente usar o filepath resultado.

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