Bom dia pessoal.
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\"");
Porém também não obtive sucesso.
Alguém sabe como resolver esse problema?
Runtime.getRuntime().exec("identify -verbose /home/usuario/Diretorio\\ de\\ Imagens/Imagem\\ 01.JPG");
ou
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.)
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?
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. )
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.
entanglement, realmente passando as informações como um array de Strings funciona. Ficou da seguinte maneira:
try {
String arquivo = "/home/usuario/Diretorio de Imagens/Imagem 01.JPG"
Runtime.getRuntime().exec(new String[]{"identify", "-verbose", arquivo});
} catch (Exception e) {
e.printStackTrace();
}
Muito obrigado.