Estou desenvolvendo um programa que irá usar alguns comandos do do programa ImageMegick. Consigo executar o programa perfeitamente, porém estou tendo problemas no Linux quando um diretório ou um arquivo tem espaços em seus nomes. No Windows esse problema foi facilmente resolvido colocando aspas (") no caminho do arquivo, ficando da seguinte forma:
Runtime.getRuntime().exec("D:/Programas/ImageMagick-6.5.7-5/identify.exe -verbose \"C:/Documents and Settings/usuario/Meus documentos/Imagem 01.JPG\"");
Porém no Linux isso não funcionou. Outra tentativa no Linux foi acrescentar barras no nome do arquivo e/ou diretório antes do espaço, da forma como é feito no shell do Linux, como no exemplo:
Runtime.getRuntime().exec("identify -verbose '/home/usuario/Diretorio de Imagens/Imagem 01.JPG'");
Eu aconselharia a segunda forma - é mais clara, mais simples e mais próxima ao que você faria no Linux “manualmente”. (Espaços em nomes de diretórios não são “kosher” em Unix ou Linux, já que a maior parte dos programas e scripts tem problemas com eles. Tente não usá-los.)
T
tiago_stos
Cara, pior tentei das duas formas e não funcionou… não acredito que esteja fazendo algo de errado já que para arquivos e diretórios sem espaços o comando funciona.
Sobre não usar arquivos e diretórios com espaços nos nomes, eu já tenho como regra não utilizar, porém como pretendo distribuir esse programa é melhor eu descobrir como resolver isso.
Alguém tem mais alguma dica?
E
entanglement
Hum… eu não gosto muito de usar o Runtime.exec que recebe apenas um parâmetro. Prefiro aquele que recebe um array como parâmetro, para que o próprio Runtime.exec ponha as aspas necessárias para o comando não se enrolar todo.
De qualquer maneira, “Imagem 01.JPG” é diferente de “Imagem 01.jpg” e não sei se o “identify” está no PATH do usuário que executa seu programa Java. (Por exemplo, se esse programa Java é o Tomcat e ele é iniciado como daemon, ele deve usar outro PATH que não o do seu usuário. )
T
tiago_stos
Então, o caminho e nome do arquivo está correto e o identify está instalado… Bom, to no inicio do projeto ainda, depois vou validar todas essas informações para que não haja nenhum erro.
Vou experimentar com o Runtime.exec que recebe o array. Muito obrigado pelas dicas.
T
tiago_stos
entanglement, realmente passando as informações como um array de Strings funciona. Ficou da seguinte maneira:
try{
Stringarquivo="/home/usuario/Diretorio de Imagens/Imagem 01.JPG"Runtime.getRuntime().exec(newString[]{"identify","-verbose",arquivo});
}catch(Exceptione){
e.printStackTrace();
}