2010-02-01 101 views
3

我發現如何用.Net讀取MSI文件。其中一些使用Wix附帶的一些庫。有沒有辦法使用Java讀取MSI數據?我想訪問表格並獲取文本值。用Java讀取MSI文件

回答

1

MSI文件是COM結構化存儲。 http://en.wikipedia.org/wiki/COM_Structured_Storage

有幾個選項。您可以嘗試使用類似如下的方式訪問它: http://poi.apache.org/poifs/index.html

您可以使用JNI訪問本機MSI API。

或者,你可以掏出來的東西像一個VBScript。該腳本將您想要的結果轉儲到stdout,然後在java應用程序中捕獲並解析結果。

+0

我從JDIC項目中找到了這個packager.jar文件。它具有WinMSIWrapper.dll的JNI包裝。但是,我使用vbscript方法。 – Omar 2010-02-05 21:07:04

1

.MSI基本上是一個數據庫。如果您可以使用Java的JdbcOdbc驅動程序讀取MS Access .MDB文件,則可以使用相同的代碼來打開.MSI,然後讀取它的表格。

Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); 
String msiFileName= "d:/java/test.msi"; 
String connectString = "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ="; 
connectString += msiFileName.trim() + ";DriverID=22;READONLY=true}"; 
Connection con = DriverManager.getConnection(connectString ,"",""); 

至少在理論上。 :)

+0

不幸的是,它拋出一個值java.sql.SQLException: [微軟] [ODBC Microsoft Access驅動程序]無法打開數據庫 '(未知)'。它可能不是您的應用程序識別的數據庫,或者該文件可能已損壞。 – Omar 2010-02-01 17:20:05

+0

也許嘗試一個Java原生訪問讀者(例如,jackcess)? – jsight 2010-02-01 17:33:45

+0

理論上它應該起作用。問題可能是MSI本身。如果它不是標準的Windows安裝程序MSI,則可能會失敗。 – Geno 2010-02-01 18:04:15

1

你能否通過Java使用Windows Installer API

的API操縱MSI文件支持的唯一途徑。如果您使用的是.NET或WiX,那麼您將使用這些調用這些函數或函數的函數或函數。

MSI的二進制文件格式是無證和版本之間可能會發生變化,所以試圖讀/寫的二進制格式直接只是想給你一個真實的頭痛。