我目前正在開發一個Java項目,該項目應該使用戶能夠導出與Windows軟件(.exe)或OS X應用程序(.app)捆綁在一起的項目,以便將數據分發給其他工作站。 Windows和OS X軟件都存儲爲壓縮的zip文件,並且在項目導出的情況下未壓縮。我的問題是,在Windows上解壓縮OS X應用程序將打破捆綁框架內的符號鏈接。這反過來打破了應用程序的簽名,並導致應用程序在OS X上啓動時出現問題。處理Windows文件系統上的unix符號鏈接文件
我使用Apache Commons壓縮庫來解壓縮包,這使我能夠檢測符號鏈接及其目標。使用OS X,我可以使用java.nio.file.Files中的方法重新創建符號鏈接,但對於Windows,這需要管理員權限,我有點猶豫是否需要添加這些權限作爲使用該軟件的先決條件(即使啓用,我不相信這會奏效 - 還沒有嘗試過)。
我對鏈接被破壞的原因有一點了解,但是如果我理解正確的話,Windows文件系統不包括對Unix符號鏈接文件類型的支持,因此鏈接解壓縮爲普通文件並且在OS X上打開時將不再被識別爲符號鏈接。
所以,我的問題是,我可以以某種方式將符號鏈接文件按位複製到Windows文件系統,保留Unix特定位或保留這些信息不可能?或者,我應該改變導出方法以將項目文件添加到現有的zip文件,在這種情況下,符號鏈接信息可能會保留,直到目標機器上的zip被解壓縮爲止?
當前的代碼循環在ZipFile
的每個ZipArchiveEntry
是如下:
byte data[] = new byte[BUFFER];
Enumeration<ZipArchiveEntry> entries = zipFile.getEntries();
while (entries.hasMoreElements()) {
ZipArchiveEntry zipEntry = entries.nextElement();
String destFilename = copyFolder + zipEntry.getName();
File destFile = new File(destFilename);
if (zipEntry.isUnixSymlink()) {
File target = new File(zipFile.getUnixSymlink(zipEntry));
try {
// Try to create symbolic link - currently only works with OS X
Files.createSymbolicLink(destFile.toPath(), target.toPath());
continue;
} catch (Exception e) {
System.out.println("Failed to create symbolic link: " +
destFile.getAbsolutePath() + " -> " +
target.getAbsolutePath());
}
}
// If file
int count;
FileOutputStream fos = new FileOutputStream(destFile);
try (BufferedOutputStream dest = new BufferedOutputStream(fos, BUFFER)) {
InputStream is = zipFile.getInputStream(zipEntry);
while ((count = is.read(data, 0, BUFFER)) != -1) {
dest.write(data, 0, count);
}
}
}
您能告訴我們更多關於這個工作流程的用法嗎(例如,什麼類型的設備是Windows上未壓縮的ZIP設備,以及該設備以後如何傳輸到Mac)?我很困惑,因爲在Windows上,只有NTFS文件系統支持符號鏈接,而FAT32則不支持,所以如果您將Windows計算機上的ZIP解壓到USB密鑰上,如果USB密鑰是FAT格式的,則符號鏈接將會丟失。如果是NTFS格式,Mac將(默認情況下)無法讀取它。 此外,任何用戶都可以對目錄進行符號鏈接,您只需要將符號鏈接文件的Admin權限。 – mihi
另外,如果您在Windows資源管理器中複製文件/符號鏈接,則無論所涉及的文件系統如何(即使NTFS轉換爲NTFS),該副本也不會被符號鏈接。 – mihi
目前的工作流程如下: 1)數據的查看軟件(OS X和Windows版本)之前被解壓縮到出口 2)導出的數據旁邊被保存到瀏覽軟件 3)整個事情再次被壓縮到一個zip文件,發送到FTP服務器。有關如何下載軟件包的說明通過電子郵件發送給接收方 並且問題: 4)OS X用戶無法打開查看軟件,因爲OS X應用程序在windows上的解壓縮 - >壓縮過程中被破壞。 – pnkkr