Usar getFileVersion em java

13 respostas
A

Pessoal,

Preciso criar um aplicativo simples em java que informe a versão de um arquivo “.EXE” e “.DLL” Peguei um código aqui no fórum que traz: tamanho do arquivo e data da ultima alteração, mas a versão não trás.

Fiz algumas pesquisas e vi que o que preciso usar “getFileVersion” e pra usá-la tenho que importar da API do Windows. Alguém sabe como fazer isso?

Tem um código em VBS que faz isso certinho, queria criar essa mesma função mas em java. Agradeço muito se alguém puder me explicar como faço isso. Abaixo está o código:

Set objFSO = CreateObject(Scripting.FileSystemObject)

logVersao = Versao.txt

Set ArqLog = objFSO.OpenTextFile(logVersao, 8, True, 0)

ArqLog.WriteLine	---------------- Versão de aplicativo -----------------

ArqLog.WriteLine "Máquina_1 Versão: " + objFSO.GetFileVersion(“IP\c$\dir\dir\arquivo.DLL”)
ArqLog.WriteLine "Máquina_1 Versão: " + objFSO.GetFileVersion(“IP\c$\dir\dir\arquivo.EXE”)

ArqLog.WriteLine "Máquina_2 Versão: " + objFSO.GetFileVersion(“IP\c$\dir\dir\arquivo.DLL”)
ArqLog.WriteLine "Máquina_2 Versão: " + objFSO.GetFileVersion(“IP\c$\dir\dir\arquivo.EXE”)

ArqLog.Close

13 Respostas

mauricioadl

cara, nao sei se estou falando besteira, mas arquivos nao tem uma propriedade versão.

E

Está :slight_smile:


mauricioadl

cara, acho que isso é coisa que muda de OS, no meu OS aqui nao tem essas informações.

E

Isso é coisa de carinha de Linux ou MacOSX tirando sarro de quem usa Windows (embora eu seja “operating-system agnostic”).

mauricioadl

realmente eu uso macos em casa e gosto muito de linux. mas a maquina que trabalho eh windows vista e fiz o teste nela e nao achei a opcao.

out!

A

mauricioadl,

Realmente alguns arquivos não tem essa aba “Version”, mas o arquivo que eu estou querendo pegar essa informação tem, e é igual a imagem que o “entanglement” postou.
Conforme meu primeiro post, eu consigo trazer algumas informações como tamanho do arquivo e ultima atualização, mas não consigo pegar a versão dele. Pesquisei e parece que tenho que usar uma função chamada ?getFileVersion? que está na API do Windows mas não tenho ideia de como fazer isso. Parece que tem que mexer também com ?JNI? e ?JNA? que também não sei o que é.

Agradeço muito pela atenção mauricioadl. Vou continuar procurando por aqui e se consegui alguma coisa eu posto pra você.

entanglement,
Muito obrigado por postar esse print, é exatamente as informações que eu quero pegar.

Abraços

E

Você usou o Windows Explorer, clicou com o botão direito (DIREITO) sobre o executável ou DLL, e escolheu no menu a opção Propriedades (ou Properties)?

mauricioadl

um jeito de fazer, mas eh uma gambiarra, eh usar o seu .vbs que funciona rodar e capturar a saida dele. da pra fazer!

ja fiz isso pra pegar informações do hardware da maquina e foi de boa. coloquei todo o codigo do .vbs dentro do fonte java pra esconder a macaquice e ja era! hehehe

[]'s

E

Deve haver alguém que encapsulou usando JNI um código semelhante a este:

http://beta.unclassified.de/code/cpp/getfileversion/

Você também poderia traduzir o código acima usando JNA, mas acho bem mais complicado.

A

mauricioadl:
um jeito de fazer, mas eh uma gambiarra, eh usar o seu .vbs que funciona rodar e capturar a saida dele. da pra fazer!

ja fiz isso pra pegar informações do hardware da maquina e foi de boa. coloquei todo o codigo do .vbs dentro do fonte java pra esconder a macaquice e ja era! hehehe

[]'s

mauricioadl,

Mas você consegue me explicar como coloco esse código de .vbs dentro do java? É complicado? Eu ainda não manjo muito.

Valeu pela dica.

A

entanglement:
Deve haver alguém que encapsulou usando JNI um código semelhante a este:

http://beta.unclassified.de/code/cpp/getfileversion/

Você também poderia traduzir o código acima usando JNA, mas acho bem mais complicado.

entanglement,

Vou dar uma olhada no código.

Obrigado.

mauricioadl

algo assim:

Runtime.getRuntime().exec(“seu_arquivo.vbs”);

A

mauricioadl:
algo assim:

Runtime.getRuntime().exec(“seu_arquivo.vbs”);

mauricioadl,

Tentei usar o trecho de código que você mandou para acionar o arquivo .vbs mas dá um erro. Se eu trocar o aquivo .vbs por um .exe dá certinho.

Abaixo está o código com .vbs e o erro que está ocorrendo:

//Codigo

import java.io.File;

import java.io.IOException;

public class Aciona {

public static void main (String []args) throws IOException{

File diretorio = new File ("D:\\");

Runtime.getRuntime().exec(diretorio+"VerificaDLL.vbs");

}

}

//Erro

Exception in thread main java.io.IOException: Cannot run program D:\VerificaDLL.vbs: CreateProcess error=193, %1 is not a valid Win32 application

at java.lang.ProcessBuilder.start(Unknown Source)

at java.lang.Runtime.exec(Unknown Source)

at java.lang.Runtime.exec(Unknown Source)

at java.lang.Runtime.exec(Unknown Source)

at Aciona.main(Aciona.java:11)

Caused by: java.io.IOException: CreateProcess error=193, %1 is not a valid Win32 application

at java.lang.ProcessImpl.create(Native Method)

at java.lang.ProcessImpl.<init>(Unknown Source)

at java.lang.ProcessImpl.start(Unknown Source) 5 more
Criado 19 de março de 2012
Ultima resposta 19 de mar. de 2012
Respostas 13
Participantes 3