106 lines
		
	
	
	
		
			3 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
			
		
		
	
	
			106 lines
		
	
	
	
		
			3 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
| package net.minecraft.util;
 | |
| 
 | |
| import com.google.common.collect.ImmutableMap;
 | |
| import com.mojang.logging.LogUtils;
 | |
| import java.io.Closeable;
 | |
| import java.io.File;
 | |
| import java.io.IOException;
 | |
| import java.io.UncheckedIOException;
 | |
| import java.nio.charset.StandardCharsets;
 | |
| import java.nio.file.FileSystem;
 | |
| import java.nio.file.FileVisitOption;
 | |
| import java.nio.file.Files;
 | |
| import java.nio.file.LinkOption;
 | |
| import java.nio.file.OpenOption;
 | |
| import java.nio.file.Path;
 | |
| import java.util.List;
 | |
| import java.util.stream.Collectors;
 | |
| import java.util.stream.Stream;
 | |
| import net.minecraft.Util;
 | |
| import org.slf4j.Logger;
 | |
| 
 | |
| public class FileZipper implements Closeable {
 | |
| 	private static final Logger LOGGER = LogUtils.getLogger();
 | |
| 	private final Path outputFile;
 | |
| 	private final Path tempFile;
 | |
| 	private final FileSystem fs;
 | |
| 
 | |
| 	public FileZipper(Path outputFile) {
 | |
| 		this.outputFile = outputFile;
 | |
| 		this.tempFile = outputFile.resolveSibling(outputFile.getFileName().toString() + "_tmp");
 | |
| 
 | |
| 		try {
 | |
| 			this.fs = Util.ZIP_FILE_SYSTEM_PROVIDER.newFileSystem(this.tempFile, ImmutableMap.of("create", "true"));
 | |
| 		} catch (IOException var3) {
 | |
| 			throw new UncheckedIOException(var3);
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	public void add(Path path, String filename) {
 | |
| 		try {
 | |
| 			Path path2 = this.fs.getPath(File.separator);
 | |
| 			Path path3 = path2.resolve(path.toString());
 | |
| 			Files.createDirectories(path3.getParent());
 | |
| 			Files.write(path3, filename.getBytes(StandardCharsets.UTF_8), new OpenOption[0]);
 | |
| 		} catch (IOException var5) {
 | |
| 			throw new UncheckedIOException(var5);
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	public void add(Path path, File filename) {
 | |
| 		try {
 | |
| 			Path path2 = this.fs.getPath(File.separator);
 | |
| 			Path path3 = path2.resolve(path.toString());
 | |
| 			Files.createDirectories(path3.getParent());
 | |
| 			Files.copy(filename.toPath(), path3);
 | |
| 		} catch (IOException var5) {
 | |
| 			throw new UncheckedIOException(var5);
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	public void add(Path path) {
 | |
| 		try {
 | |
| 			Path path2 = this.fs.getPath(File.separator);
 | |
| 			if (Files.isRegularFile(path, new LinkOption[0])) {
 | |
| 				Path path3 = path2.resolve(path.getParent().relativize(path).toString());
 | |
| 				Files.copy(path3, path);
 | |
| 			} else {
 | |
| 				Stream<Path> stream = Files.find(path, Integer.MAX_VALUE, (pathx, basicFileAttributes) -> basicFileAttributes.isRegularFile(), new FileVisitOption[0]);
 | |
| 
 | |
| 				try {
 | |
| 					for (Path path4 : (List)stream.collect(Collectors.toList())) {
 | |
| 						Path path5 = path2.resolve(path.relativize(path4).toString());
 | |
| 						Files.createDirectories(path5.getParent());
 | |
| 						Files.copy(path4, path5);
 | |
| 					}
 | |
| 				} catch (Throwable var8) {
 | |
| 					if (stream != null) {
 | |
| 						try {
 | |
| 							stream.close();
 | |
| 						} catch (Throwable var7) {
 | |
| 							var8.addSuppressed(var7);
 | |
| 						}
 | |
| 					}
 | |
| 
 | |
| 					throw var8;
 | |
| 				}
 | |
| 
 | |
| 				if (stream != null) {
 | |
| 					stream.close();
 | |
| 				}
 | |
| 			}
 | |
| 		} catch (IOException var9) {
 | |
| 			throw new UncheckedIOException(var9);
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	public void close() {
 | |
| 		try {
 | |
| 			this.fs.close();
 | |
| 			Files.move(this.tempFile, this.outputFile);
 | |
| 			LOGGER.info("Compressed to {}", this.outputFile);
 | |
| 		} catch (IOException var2) {
 | |
| 			throw new UncheckedIOException(var2);
 | |
| 		}
 | |
| 	}
 | |
| }
 |