/*
* #######################################################
*
* Copyright (c) 2013, A. Weinberger. All rights reserved.
* --------------------------------------------------------
*/
package ale.util.fileUtil;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.file.FileVisitResult;
import java.nio.file.FileVisitor;
import java.nio.file.Files;
import java.nio.file.LinkOption;
import java.nio.file.Path;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;
final class DirectoryZip {
private static String suffix = ".zip";
private static final int BUFFERSIZE = 4096;
private static int prefixLength;
private static ZipOutputStream zipOut;
private static byte[] ioBuffer = new byte[BUFFERSIZE];
private DirectoryZip() {
}
static void zipDirectory(Path zipdir, Path destDirectory, String zipSuffix) throws IOException {
assert FileUtil.controlDirectory(zipdir) && (destDirectory != null);
if (zipSuffix != null) {
suffix = zipSuffix;
} else {
suffix = ".zip";
}
prefixLength = zipdir.toString().lastIndexOf("/") + 1;
zipOut = new ZipOutputStream(new FileOutputStream(destDirectory.resolve(zipdir.getFileName() + suffix).toFile()));
createZipFrom(zipdir.toFile());
zipOut.close();
}
private static void createZipFrom(final File dir) throws IOException {
Files.walkFileTree(dir.toPath(), new FileVisitor<Path>() {
Path tmp = dir.toPath();
@Override
public FileVisitResult postVisitDirectory(Path dir1, IOException exc) throws IOException {
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult preVisitDirectory(Path dir1, BasicFileAttributes attrs) throws IOException {
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
FileInputStream in = new FileInputStream(file.toString());
zipOut.putNextEntry(new ZipEntry(file.subpath(this.tmp.getNameCount(), file.getNameCount()).toString()
.substring(prefixLength)));
int bytesRead;
while ((bytesRead = in.read(ioBuffer)) > 0) {
zipOut.write(ioBuffer, 0, bytesRead);
}
zipOut.closeEntry();
in.close();
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException {
return FileVisitResult.TERMINATE;
}
});
}
static boolean unpackZipTo(Path zipfile, Path destDirectory) throws IOException {
boolean ret = true;
byte[] bytebuffer = new byte[BUFFERSIZE];
ZipInputStream zipinputstream = new ZipInputStream(new FileInputStream(zipfile.toFile()));
ZipEntry zipentry;
while ((zipentry = zipinputstream.getNextEntry()) != null) {
Path newFile = destDirectory.resolve(zipentry.getName());
if (!Files.exists(newFile.getParent(), LinkOption.NOFOLLOW_LINKS)) {
Files.createDirectories(newFile.getParent());
}
if (!Files.isDirectory(newFile, LinkOption.NOFOLLOW_LINKS)) {
FileOutputStream fileoutputstream = new FileOutputStream(newFile.toFile());
int bytes;
while ((bytes = zipinputstream.read(bytebuffer)) > -1) {
fileoutputstream.write(bytebuffer, 0, bytes);
}
fileoutputstream.close();
}
zipinputstream.closeEntry();
}
zipinputstream.close();
return ret;
}
public static boolean unpackFileFromZip(Path zipfile, String filename, Path destDirectory) throws IOException {
boolean ret = true;
byte[] bytebuffer = new byte[BUFFERSIZE];
ZipInputStream zipinputstream = new ZipInputStream(new FileInputStream(zipfile.toFile()));
ZipEntry zipentry;
while ((zipentry = zipinputstream.getNextEntry()) != null) {
if (zipentry.getName().equals(filename)) {
Path newFile = destDirectory.resolve(zipentry.getName());
FileOutputStream fileoutputstream = new FileOutputStream(newFile.toFile());
int bytes;
while ((bytes = zipinputstream.read(bytebuffer)) > -1) {
fileoutputstream.write(bytebuffer, 0, bytes);
}
fileoutputstream.close();
zipinputstream.closeEntry();
zipinputstream.close();
return ret;
}
zipinputstream.closeEntry();
}
zipinputstream.close();
return ret;
}
}