package net.lingala.zip4j.unzip; import java.io.File; import net.lingala.zip4j.exception.ZipException; import net.lingala.zip4j.model.FileHeader; import net.lingala.zip4j.model.UnzipParameters; import net.lingala.zip4j.util.InternalZipConstants; import net.lingala.zip4j.util.Zip4jUtil; public class UnzipUtil { public static void applyFileAttributes(FileHeader fileHeader, File file) throws ZipException { applyFileAttributes(fileHeader, file, null); } public static void applyFileAttributes(FileHeader fileHeader, File file, UnzipParameters unzipParameters) throws ZipException{ if (fileHeader == null) { throw new ZipException("cannot set file properties: file header is null"); } if (file == null) { throw new ZipException("cannot set file properties: output file is null"); } if (!Zip4jUtil.checkFileExists(file)) { throw new ZipException("cannot set file properties: file doesnot exist"); } if (unzipParameters == null || !unzipParameters.isIgnoreDateTimeAttributes()) { setFileLastModifiedTime(fileHeader, file); } if (unzipParameters == null) { setFileAttributes(fileHeader, file, true, true, true, true); } else { if (unzipParameters.isIgnoreAllFileAttributes()) { setFileAttributes(fileHeader, file, false, false, false, false); } else { setFileAttributes(fileHeader, file, !unzipParameters.isIgnoreReadOnlyFileAttribute(), !unzipParameters.isIgnoreHiddenFileAttribute(), !unzipParameters.isIgnoreArchiveFileAttribute(), !unzipParameters.isIgnoreSystemFileAttribute()); } } } private static void setFileAttributes(FileHeader fileHeader, File file, boolean setReadOnly, boolean setHidden, boolean setArchive, boolean setSystem) throws ZipException { if (fileHeader == null) { throw new ZipException("invalid file header. cannot set file attributes"); } byte[] externalAttrbs = fileHeader.getExternalFileAttr(); if (externalAttrbs == null) { return; } int atrrib = externalAttrbs[0]; switch (atrrib) { case InternalZipConstants.FILE_MODE_READ_ONLY: if (setReadOnly) Zip4jUtil.setFileReadOnly(file); break; case InternalZipConstants.FILE_MODE_HIDDEN: case InternalZipConstants.FOLDER_MODE_HIDDEN: if (setHidden) Zip4jUtil.setFileHidden(file); break; case InternalZipConstants.FILE_MODE_ARCHIVE: case InternalZipConstants.FOLDER_MODE_ARCHIVE: if (setArchive) Zip4jUtil.setFileArchive(file); break; case InternalZipConstants.FILE_MODE_READ_ONLY_HIDDEN: if (setReadOnly) Zip4jUtil.setFileReadOnly(file); if (setHidden) Zip4jUtil.setFileHidden(file); break; case InternalZipConstants.FILE_MODE_READ_ONLY_ARCHIVE: if (setArchive) Zip4jUtil.setFileArchive(file); if (setReadOnly) Zip4jUtil.setFileReadOnly(file); break; case InternalZipConstants.FILE_MODE_HIDDEN_ARCHIVE: case InternalZipConstants.FOLDER_MODE_HIDDEN_ARCHIVE: if (setArchive) Zip4jUtil.setFileArchive(file); if (setHidden) Zip4jUtil.setFileHidden(file); break; case InternalZipConstants.FILE_MODE_READ_ONLY_HIDDEN_ARCHIVE: if (setArchive) Zip4jUtil.setFileArchive(file); if (setReadOnly) Zip4jUtil.setFileReadOnly(file); if (setHidden) Zip4jUtil.setFileHidden(file); break; case InternalZipConstants.FILE_MODE_SYSTEM: if (setReadOnly) Zip4jUtil.setFileReadOnly(file); if (setHidden) Zip4jUtil.setFileHidden(file); if (setSystem) Zip4jUtil.setFileSystemMode(file); break; default: //do nothing break; } } private static void setFileLastModifiedTime(FileHeader fileHeader, File file) throws ZipException { if (fileHeader.getLastModFileTime() <= 0) { return; } if (file.exists()) { file.setLastModified(Zip4jUtil.dosToJavaTme(fileHeader.getLastModFileTime())); } } }