Aumentar o número de caracteres no campo nome do arquivo do diálogo de seleção de arquivo GetOpenFileName

StackOverflow https://stackoverflow.com/questions/361350

Pergunta

O aplicativo permite que vários arquivos a ser selecionado em um diálogo de seleção de arquivo que é mostrado através da função GetOpenFileName (esta questão também se aplica a pessoas utilizando CFileDialog, etc ...)

Parece haver um limite para o número de caracteres que podem ser introduzidas no campo de nome de arquivo (259 parece ser o número mágico - não sei porquê).

Temos tentado mudar os seguintes membros do OPENFILENAME estrutura :

lpstrFile - ponto para o nosso próprio buffer, dimensionada em 4K bytes nMaxFile - definido para o tamanho de lpstrFile (estamos compilando ANSI, então este é efetivamente 4000

Mas estes valores parecem não aumentar a largura de entrada do campo de nome de arquivo na caixa de diálogo.

Vou experimentar com o envio de uma mensagem EM_SETLIMITTEXT ao controle, mas queria saber se alguém tem uma solução.

EDIT - resolvido isso mesmo: solução não posso aceitar a minha própria resposta, mas aqui é para a posteridade. Se alguém tem uma solução melhor, por favor, postá-lo -. Ou se sentir livre para mod-se a minha solução para que futuros pesquisadores vão encontrá-lo no topo

Foi útil?

Solução

Acontece que o controle de edição (Pelo menos no meu ambiente de desenvolvimento) é uma caixa de combinação, de modo EM_SETLIMITTEXT não é apropriado.

Em vez disso, eu rastreou a caixa de combinação usando GetDlgCtrl sobre o pai da caixa de diálogo de abertura de arquivo (eu faço isso no manipulador OnInitDialog), lançá-lo aos CComboBox*, em seguida, chamar LimitText() para definir o limite.

Isto pode também ser feito através do envio de uma mensagem CB_LIMITTEXT ao controle para aqueles de vocês que não estão trabalhando com CFileDialog. O valor apropriado aqui é mais provável que o valor OPENFIILENAME.nMaxFile que é passado.

Outras dicas

A partir A nomeação de um arquivo ou diretório no MSDN :

o Windows API (com algumas excepções discutidas nos parágrafos seguintes), o comprimento máximo de um caminho é MAX_PATH, a qual é definida como 260 caracteres.

Mesmo se você pudesse coagir cadeias mais longas fora do diálogo, você pode ter problemas para baixo da linha quando se usa APIs que foram codificados contra MAX_PATH.

Os documentos vão dizer:

A API do Windows tem muitas funções que também têm versões Unicode para permitir que um caminho de comprimento estendido para uma máximo comprimento total caminho de 32.767 personagens. Este tipo de caminho é composto por componentes separados por barras invertidas, cada um, até o valor retornado na parâmetro lpMaximumComponentLength de a função GetVolumeInformation. Para especificar um caminho de comprimento alargado, uso o prefixo "\\?\". Por exemplo, "\\?\D:\<very long path>". (O caracteres < > são usados ??aqui para claridade visual e não pode ser parte de um cadeia de caminho válido.)

Eu acredito que este é um limite rígido que não pode ser ignorada. A única vez que isso deveria importar é quando você quiser selecionar mais de um arquivo, uma vez que o limite é suficiente para o comprimento máximo nome do arquivo.

Eu adicionei um botão "Todos os arquivos" para esses diálogos para a abertura de todos os arquivos em uma pasta; essa é a única solução que eu encontrei.

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