我想从zip archieve中提取Unix可执行文件。它在Windows上正常工作但在Mac上不起作用。我的代码下载了zip文件并将其提取到特定位置。它确实提取文件,但文件是可执行文件,并将其作为TextEdit文档提取。当我通过手动提取它时,我得到了可执行文件。我应该强迫某些东西还是有任何许可?提前谢谢。
这是我的解压缩功能:
public void decompress(String zipFilePath, String extractedFilePath) {
byte[] buffer = new byte[1024];
try {
ZipInputStream zipInputStream = new ZipInputStream(new FileInputStream(extractedFilePath.toString()));
ZipEntry ze = zipInputStream.getNextEntry();
while (ze != null) {
String filename = ze.getName();
File newFile = new File(zipFilePath +_config.configProperties().getPathSeparator()+ filename + _config.configProperties().getVersion());
FileOutputStream fos = new FileOutputStream(newFile);
int len;
while ((len = zipInputStream.read(buffer)) > 0) {
fos.write(buffer, 0, len);
}
fos.close();
ze = zipInputStream.getNextEntry();
}
zipInputStream.closeEntry();
zipInputStream.close();
}catch (IOException ex){
ex.printStackTrace();
}
}
答案 0 :(得分:1)
默认情况下,Mac不知道如何处理.exe
文件,除非您的系统上有Windows虚拟机(在这种情况下,虚拟机将打开.exe
文件双击)。该文件可能与您的代码完全提取(很可能),但如果它有.exe
扩展或根本没有扩展,那么它将默认为TextEdit文档,因为Mac不知道还有什么用它
您可以在压缩之前和之后验证文件的SHA1校验和,以确保它们完全相同。
your-mac:demo$ shasum manual_extraction.bin
your-mac:demo$ shasum code_extracted_version.bin
对于手动提取的版本(完美的版本)和您的代码提取的版本(已损坏的版本),终端上的Mac上的以下命令的结果会很有趣:
your-mac:demo$ xxd manual_extraction.bin| head
your-mac:demo$ xxd code_extracted_version.bin| head
只是旁注 - 我注意到您将extractedFilePath
参数作为String
传入,但稍后仍在extractedFilePath.toString()
中调用ZipInputStream()
。
答案 1 :(得分:1)
伙计们我找到了解决方案。
Runtime.getRuntime().exec("chmod u+x " + filepath);
当我把它放在我的代码块中时它起作用了。我之前猜到它需要这个权限。谢谢你们。