Logo Hardware.com.br
Lucas_Alexandre
Lucas_Alexan... Veterano Registrado
787 Mensagens 42 Curtidas

Problema com nome de arquivo em um programa

#1 Por Lucas_Alexan... 07/02/2014 - 13:12
Olá pessoal,

Estou fazendo um programa que manipula arquivos. O problema é que o programa está tendo problemas com o nome do arquivo, que possui espaços. e outros caracéres.

O programa é em texto, não possui interface gráfica. Pesquisei e descobri que posso converter o nome do arquivo para o formato 8.3.

No caso, um arquivo normal chamado meu arquivo.txt se chamaria MEUARQ~1.TXT. Porém, se eu tiver arquivos meu arquivo 2.txt, etc, meu programa não vai saber abrir, ou vai sempre abrir o mesmo arquivo, pois não vai saber da existência de outros arquivos com nome parecido.

Alguém sabe se existe alguma solução parai sso?

Ele reproduz o arquivo utilizando a API MCI do Windows.

Obrigado!
Sou um dos poucos cegos do Brasil que tem coragem de mexer com hardware. Peço que ao postarem imagens (ao menos nos meus tópicos) descrevam para mim, desta forma saberei do que se trata, principalmente se for um texto, ou parâmetros técnicos de um print.
______________________
Notebook SAMSUNG 300V4A Tela 14" (de segunda mão, troquei a tela, teclado não funciona algumas teclas, acho que estraguei o som onboard :lolsmile.png
Core i5-2450M @ 3.1GHz
Memória 10GB DDR3-1600
SSD Goldenfir 240GB
HDD Samsung 320GB
Troco de SETUP igual camaleão...
ripongao
ripongao Veterano Registrado
755 Mensagens 94 Curtidas
#2 Por ripongao
07/02/2014 - 13:16
Tente colocar aspas no nome com espaços, o mesmo deve acontecer para o senhor se o arquivo for 1.txt mas estiver na pasta "Arquivos de programas".
Lembro de ter visto alguma função nativa na ntdll.dll que fazia essa conversão entre nomes do windows para nomes formato ms-dos, 8.3 como dito, tente aí com espaços, se o problema persistir posso tentar ver aqui como fazer, digo, saber o nome da função e realizar testes.
Desliguei-me do fórum. Conta canelada.
Lucas_Alexandre
Lucas_Alexan... Veterano Registrado
787 Mensagens 42 Curtidas
#3 Por Lucas_Alexan...
07/02/2014 - 14:05
ripongao disse:

Olá Ripongal,

Obrigado pela sugestão. Porém, a linguagem de programação que estou utilizando é diferente. Ela na verdade é uma linguagem em que executa um arquivo com comandos em português, quando o arquivo é executado, ele é "traduzido" para pascal.

Por exemplo, para definir uma variável, eu consigo usar:

seja $variavel "Valor"

No caso, ele fica já com as aspas. Daí não tenho certeza se funciona, mas poderia tentar colocar duas aspas talvez.
Sou um dos poucos cegos do Brasil que tem coragem de mexer com hardware. Peço que ao postarem imagens (ao menos nos meus tópicos) descrevam para mim, desta forma saberei do que se trata, principalmente se for um texto, ou parâmetros técnicos de um print.
______________________
Notebook SAMSUNG 300V4A Tela 14" (de segunda mão, troquei a tela, teclado não funciona algumas teclas, acho que estraguei o som onboard :lolsmile.png
Core i5-2450M @ 3.1GHz
Memória 10GB DDR3-1600
SSD Goldenfir 240GB
HDD Samsung 320GB
Troco de SETUP igual camaleão...
ripongao
ripongao Veterano Registrado
755 Mensagens 94 Curtidas
#4 Por ripongao
07/02/2014 - 16:14
é, iria sugerir isso, na linguagem que programo quando desejo aspas coloco 3 aspas, ou então duas aspas simples e uma dupla, ' " ' , ou então usando algum caracter de escape junto com as aspas, geralmente é o barra invertida '\', e por fim, usando hexadecimal, em C colocam '0x' antes do número hexa (0x20), na que programo colocamos um 'h' ao fim (20h), dê uma olhada na tabela ascii para saber o correspondente hexadecimal do símbolo (letra,pontuação,números), pode ser que dê certo.

Qual é a linguagem que trabalha? poderia citar? Se não resolver poste aí, a gente dá um jeito, se for o caso posso pesquisar sobre esse problema e fazer um programa via linha de comandos para tí e no seu programa o senhor invocará este outro, mas aí precisamos conversar para saber o que o senhor gostaria de ter como retorno do programa. Pensei aqui e poderia também fazer uma .dll só para isso, o senhor invocará a função a partir do seu programa. Se der para ser hoje melhor ainda, pois amanhã faço mais uma primavera e vou encher a caneca.
Desliguei-me do fórum. Conta canelada.
Lucas_Alexandre
Lucas_Alexan... Veterano Registrado
787 Mensagens 42 Curtidas
#5 Por Lucas_Alexan...
07/02/2014 - 17:52
ripongao disse:

Amigo, essa linguagem é diferente. Chama-se Scriptvox.

Veja algumas partes do arquivo que interpreta a linguagem:

{--------------------------------------------------------}
{ comando escreve
{--------------------------------------------------------}

function processaEscreve (lido: string): boolean;
var pulaLinha: boolean;
arqSel: char;
mudo: boolean;
valor: string;
p: pchar;
saida: string;

Mais especificamente o programa interpreta arquivos no formato .pro.

mesmo assim, tudo feito vira em pascal.
Sou um dos poucos cegos do Brasil que tem coragem de mexer com hardware. Peço que ao postarem imagens (ao menos nos meus tópicos) descrevam para mim, desta forma saberei do que se trata, principalmente se for um texto, ou parâmetros técnicos de um print.
______________________
Notebook SAMSUNG 300V4A Tela 14" (de segunda mão, troquei a tela, teclado não funciona algumas teclas, acho que estraguei o som onboard :lolsmile.png
Core i5-2450M @ 3.1GHz
Memória 10GB DDR3-1600
SSD Goldenfir 240GB
HDD Samsung 320GB
Troco de SETUP igual camaleão...
ripongao
ripongao Veterano Registrado
755 Mensagens 94 Curtidas
#6 Por ripongao
07/02/2014 - 18:58
desconheço, até bom saber, vou procurar depois sobre.
Pensei aqui e o senhor pode criar um buffer de 1024 bytes, (o máximo do windows para caminho são 260 bytes, digo, 260 letras), concatenar uma aspas, concatenar a string e concatenar uma aspas, pode ser que dê certo.
Sugerí um buffer maior pois pode-se usar unicode ao invés de ansi/ascii.

Pelo que comentou da linguagem parece ser um interpretador, vou procurar saber sobre e se o download for pequeno o faço e testo aqui. Depois posto meus achados. Ahh é, tem como o senhor fazer um snippet (trecho/pedaço) de código que abre o arquivo "meu texto.txt" e que seja válido?

obs: por acaso é esse scriptvox?
Desliguei-me do fórum. Conta canelada.
Lucas_Alexandre
Lucas_Alexan... Veterano Registrado
787 Mensagens 42 Curtidas
#7 Por Lucas_Alexan...
07/02/2014 - 19:53
ripongao disse:

Olá Ripongal,

É este sim.

Porém, eu uso a versão 5.1, que possui outros nomes de comandos.

No caso imagino que para fazer as aspas, seja dessa forma:

seja $aspas """
seja $arquivo $aspas
concatena $arquivo "C:\Meu texto.txt"
concatena $arquivo $aspas

No caso, criei uma variável com as aspas, criei outra chamada arquivo com o valor que está em $aspas, concatenei o caminho e fechei as aspas.
Sou um dos poucos cegos do Brasil que tem coragem de mexer com hardware. Peço que ao postarem imagens (ao menos nos meus tópicos) descrevam para mim, desta forma saberei do que se trata, principalmente se for um texto, ou parâmetros técnicos de um print.
______________________
Notebook SAMSUNG 300V4A Tela 14" (de segunda mão, troquei a tela, teclado não funciona algumas teclas, acho que estraguei o som onboard :lolsmile.png
Core i5-2450M @ 3.1GHz
Memória 10GB DDR3-1600
SSD Goldenfir 240GB
HDD Samsung 320GB
Troco de SETUP igual camaleão...
ripongao
ripongao Veterano Registrado
755 Mensagens 94 Curtidas
#8 Por ripongao
07/02/2014 - 21:30
fiz uns testes aqui dom e conseguí ecoar os espaços dentro de aspas, veja se te adianta:

1.pro

Escreve """teste de aspas com espaços dentro"""
seja $aspas '"'
seja $arquivo ""
concatena $arquivo $aspas
concatena $arquivo "C:\Meu texto.txt"
concatena $arquivo $aspas
Escreve $arquivo
le x ;para pausar o programa e visualizarmos a saída


Caso não funcione ou não adiante, diga aí que posso testar outras formas.
Desliguei-me do fórum. Conta canelada.
Lucas_Alexandre
Lucas_Alexan... Veterano Registrado
787 Mensagens 42 Curtidas
#9 Por Lucas_Alexan...
07/02/2014 - 22:45
ripongao disse:


Olá, eu segui seu código e tentei reproduzir um arquivo com este código:

Nota: Nesse interpretador os comentários são feitos com o sinal *

Escreve """teste de aspas com espaços dentro"""
seja $aspas """
seja $arquivo ""
concatena $arquivo $aspas
concatena $arquivo "C:\Arquivo.mp4"
concatena $arquivo $aspas
Escreve $arquivo
seja $mcicomando "play "
concatena $mcicomando $arquivo
* Escreve resultado do comando MCI
Escreve $mcicomando
* Envia comando do MCI (m = Saida MCI $arquivo = Nome do arquivo)
mci m $arquivo
le x
* para pausar o programa e visualizarmos a saída

Mas as aspas no nome do arquivo ficaram corretas.
Sou um dos poucos cegos do Brasil que tem coragem de mexer com hardware. Peço que ao postarem imagens (ao menos nos meus tópicos) descrevam para mim, desta forma saberei do que se trata, principalmente se for um texto, ou parâmetros técnicos de um print.
______________________
Notebook SAMSUNG 300V4A Tela 14" (de segunda mão, troquei a tela, teclado não funciona algumas teclas, acho que estraguei o som onboard :lolsmile.png
Core i5-2450M @ 3.1GHz
Memória 10GB DDR3-1600
SSD Goldenfir 240GB
HDD Samsung 320GB
Troco de SETUP igual camaleão...
ripongao
ripongao Veterano Registrado
755 Mensagens 94 Curtidas
#10 Por ripongao
08/02/2014 - 00:28
boas lucas;
mas tem um detalhe dom, a atribuição da variável
seja $aspas """
tá errada, era para ser uma aspas simples!?, é um símbolo que parece com apóstrofo, acho que o nome é aspas inglesa.
Repare que é uma aspas inglesa, a aspas dupla, e após outra aspas inglesa, digo:
seja $aspas '"'

Se não funcionar para você é porque temos versões diferentes.
Após essa modificação deu problema na linha onze, naquele lance do "mci m ...", a mensagem de erro é "a variável M não pode ser inicializada", talvez falte declará-la ou erro de sintaxe, mas como ainda não sei então conto com vossa ajuda.

ops, perdão, o senhor esta dizendo que mesmo aparecendo aspas não tá funcionando? Hmm, então pode ser que a linguagem (ambiente) não suporte tal apetrecho, talvez tenha alguma documentação sobre. Bom, qual a mensagem de erro para o senhor? O que é ecoado na tela?
Desliguei-me do fórum. Conta canelada.
Lucas_Alexandre
Lucas_Alexan... Veterano Registrado
787 Mensagens 42 Curtidas
#11 Por Lucas_Alexan...
08/02/2014 - 00:56
ripongao disse:


Olá Ripongal,

Na verdade, não existe mensagem de erro, simplesmente não reproduz, porém o caminho está correto, inclusive com as aspas.
Eu tive que alterar seja $aspas '"' pois minha versão deu erro de execução na linha 2, somente mudando para """. Talvez eu podia tentar fazer algum aplicativo externo que convertesse o nome. Daí chamá-lo por exemplo com:
convert.exe nome do arquivo

Não sei como é feito em vários programas para isso dar certo, ou até nos gráficos. Acho que nos gráficos a API converte.
Sou um dos poucos cegos do Brasil que tem coragem de mexer com hardware. Peço que ao postarem imagens (ao menos nos meus tópicos) descrevam para mim, desta forma saberei do que se trata, principalmente se for um texto, ou parâmetros técnicos de um print.
______________________
Notebook SAMSUNG 300V4A Tela 14" (de segunda mão, troquei a tela, teclado não funciona algumas teclas, acho que estraguei o som onboard :lolsmile.png
Core i5-2450M @ 3.1GHz
Memória 10GB DDR3-1600
SSD Goldenfir 240GB
HDD Samsung 320GB
Troco de SETUP igual camaleão...
ripongao
ripongao Veterano Registrado
755 Mensagens 94 Curtidas
#12 Por ripongao
08/02/2014 - 14:04
hmm, que estranho lucas, não ter funcionado com aspas, bom, enfim, fiz um programa para transformar um caminho longo ou nome de um arquivo longo para o formato 8.3, segue em anexo.

Detalhe: Fiz o programa às pressas, e tem que ter o .exe na linha de comandos ok, exemplo:

C:\>caminho.exe "Documents and Settings"
DOCUME~1
C:\>caminho.exe "Arquivos de programas\Debugging Tools for Windows"
ARQUIV~1\DEBUGG~1
C:\>caminho.exe "Arquivos de programas\Debugging Tools for Windows" > i.txt
C:\>type i.txt
ARQUIV~1\DEBUGG~1
C:\>caminho.exe HijackThis.exe
HIJACK~1.EXE

Se o programa não conseguir converter o nome então a mensagem erro será retornada.
O senhor pode renomear o programa para o nome que desejar, mas ao usá-lo via linha de comandos não se esqueça de colocar o nome completo com a extensão .exe ok.
Fiz o programa pensando em redirecionamento, assim como mostrado no exemplo acima, onde redirecionei a saída do programa para um arquivo chamado i.txt

Bom, se precisar de modificações, se encontrar algum erro ou ter alguma sugestão (como por exemplo alguma janela ou caixa de edição visual) é só falar ok, mas por hoje é só, vou encher a caneca.

Anexos

Desliguei-me do fórum. Conta canelada.
Lucas_Alexandre
Lucas_Alexan... Veterano Registrado
787 Mensagens 42 Curtidas
#13 Por Lucas_Alexan...
08/02/2014 - 19:01
ripongao disse:


Muito obrigado pela ajuda Ripongao

Eu ainda vou testar o programa, se funcionar irei retornar.

Bem, o que fiz foi colocar no comando um >temp.txt, pois minha linguagem não tem acesso direto, como memória, então ele salva temporariamente o nome em um arquivo, o script abre o arquivo, pega o nome, fecha e deleta.

Edit:

Ripongao, agradeço sua ajuda! Funcionou!
Fiz um script para testar o aplicativo:


seja $aspas """

escreve "Digite um nome de arquivo longo: "
lê $arquivo
seja $comando "caminho.exe "
concatena $comando $aspas
concatena $comando $arquivo
concatena $comando $aspas
concatena $comando " >temp.txt"
abre #1 "temp.txt"
lê #1 $nomearq
fecha #1
remove "temp.txt"
escreve "Nome do arquivo em 8.3: "$nomearq"
termina mudo

Não consegui testar o Script, mas é certo que funciona. Estou no Linux, utilizando o Wine, então não da muito certo executar o aplicativo.
Mesmo assim, se você quiser testar pode testar.

Dentre as idéias de programas nessa linguagem estava desenvolvendo um programa que utiliza o ffmpeg para converter arquivos.

Mas não funcionava devido ao caminho do arquivo.
Sou um dos poucos cegos do Brasil que tem coragem de mexer com hardware. Peço que ao postarem imagens (ao menos nos meus tópicos) descrevam para mim, desta forma saberei do que se trata, principalmente se for um texto, ou parâmetros técnicos de um print.
______________________
Notebook SAMSUNG 300V4A Tela 14" (de segunda mão, troquei a tela, teclado não funciona algumas teclas, acho que estraguei o som onboard :lolsmile.png
Core i5-2450M @ 3.1GHz
Memória 10GB DDR3-1600
SSD Goldenfir 240GB
HDD Samsung 320GB
Troco de SETUP igual camaleão...
ripongao
ripongao Veterano Registrado
755 Mensagens 94 Curtidas
#14 Por ripongao
09/02/2014 - 05:26
boas Lucas;
testei o script aqui e não funcionou, creio que temos versões diferentes do programa, estou usando a beta 6.0, deu erro na hora de abrir o arquivo, pelo que lí estão mudando um pouco a sintaxe.

Fico feliz que o programa possa ser útil, precisando que eu altere algo é só falar, to aqui pra isso ok.
abraços.

Esquecí de comentar, as aspas são opcionais. Fiz assim pois as aspas eram o problema inicial né, e na versão que tenho difere da que o senhor possui.

C:\>caminho.exe Documents and Settings
DOCUME~1
Desliguei-me do fórum. Conta canelada.
Lucas_Alexandre
Lucas_Alexan... Veterano Registrado
787 Mensagens 42 Curtidas
#15 Por Lucas_Alexan...
09/02/2014 - 22:30
ripongao disse:


Olá!

Ripongao, quando testei no meu Windows (Windows 8 PRO) deu um erro que o caminho.exe não está respondendo. O que pode ser isso?

Obrigado!
Sou um dos poucos cegos do Brasil que tem coragem de mexer com hardware. Peço que ao postarem imagens (ao menos nos meus tópicos) descrevam para mim, desta forma saberei do que se trata, principalmente se for um texto, ou parâmetros técnicos de um print.
______________________
Notebook SAMSUNG 300V4A Tela 14" (de segunda mão, troquei a tela, teclado não funciona algumas teclas, acho que estraguei o som onboard :lolsmile.png
Core i5-2450M @ 3.1GHz
Memória 10GB DDR3-1600
SSD Goldenfir 240GB
HDD Samsung 320GB
Troco de SETUP igual camaleão...
© 1999-2025 Hardware.com.br. Todos os direitos reservados.
Imagem do Modal