import java.util.*; import java.util.zip.*; import java.util.List; import java.util.regex.*; import java.util.concurrent.*; import java.util.concurrent.atomic.*; import java.util.concurrent.locks.*; import javax.swing.*; import javax.swing.event.*; import javax.swing.text.*; import javax.swing.table.*; import java.io.*; import java.net.*; import java.lang.reflect.*; import java.lang.ref.*; import java.lang.management.*; import java.security.*; import java.security.spec.*; import java.awt.*; import java.awt.event.*; import java.awt.image.*; import javax.imageio.*; import java.math.*; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import com.github.junrar.Archive; import com.github.junrar.exception.RarException; import com.github.junrar.rarfile.FileHeader; class main { // junrar // apache logging /** * extract an archive to the given location * * @author edmund wagner * */ private static Log logger = LogFactory.getLog(main.class .getName()); public static void extractArchive(String archive, String destination) { if (archive == null || destination == null) { throw new RuntimeException("archive and destination must me set"); } File arch = new File(archive); if (!arch.exists()) { throw new RuntimeException("the archive does not exit: " + archive); } File dest = new File(destination); if (!dest.exists() || !dest.isDirectory()) { throw new RuntimeException( "the destination must exist and point to a directory: " + destination); } extractArchive(arch, dest); } public static void main(final String[] args) throws Exception { if (args.length == 2) { extractArchive(args[0], args[1]); } else { System.out .println("usage: java -jar extractArchive.jar "); } } public static void extractArchive(File archive, File destination) { Archive arch = null; try { arch = new Archive(archive); } catch (RarException e) { logger.error(e); } catch (IOException e1) { logger.error(e1); } if (arch != null) { if (arch.isEncrypted()) { logger.warn("archive is encrypted cannot extreact"); return; } FileHeader fh = null; while (true) { fh = arch.nextFileHeader(); if (fh == null) { break; } if (fh.isEncrypted()) { logger.warn("file is encrypted cannot extract: " + fh.getFileNameString()); continue; } logger.info("extracting: " + fh.getFileNameString()); try { if (fh.isDirectory()) { createDirectory(fh, destination); } else { File f = createFile(fh, destination); OutputStream stream = new FileOutputStream(f); arch.extractFile(fh, stream); stream.close(); } } catch (IOException e) { logger.error("error extracting the file", e); } catch (RarException e) { logger.error("error extraction the file", e); } } } } private static File createFile(FileHeader fh, File destination) { File f = null; String name = null; if (fh.isFileHeader() && fh.isUnicode()) { name = fh.getFileNameW(); } else { name = fh.getFileNameString(); } f = new File(destination, name); if (!f.exists()) { try { f = makeFile(destination, name); } catch (IOException e) { logger.error("error creating the new file: " + f.getName(), e); } } return f; } private static File makeFile(File destination, String name) throws IOException { String[] dirs = name.split("\\\\"); if (dirs == null) { return null; } String path = ""; int size = dirs.length; if (size == 1) { return new File(destination, name); } else if (size > 1) { for (int i = 0; i < dirs.length - 1; i++) { path = path + File.separator + dirs[i]; new File(destination, path).mkdir(); } path = path + File.separator + dirs[dirs.length - 1]; File f = new File(destination, path); f.createNewFile(); return f; } else { return null; } } private static void createDirectory(FileHeader fh, File destination) { File f = null; if (fh.isDirectory() && fh.isUnicode()) { f = new File(destination, fh.getFileNameW()); if (!f.exists()) { makeDirectory(destination, fh.getFileNameW()); } } else if (fh.isDirectory() && !fh.isUnicode()) { f = new File(destination, fh.getFileNameString()); if (!f.exists()) { makeDirectory(destination, fh.getFileNameString()); } } } private static void makeDirectory(File destination, String fileName) { String[] dirs = fileName.split("\\\\"); if (dirs == null) { return; } String path = ""; for (String dir : dirs) { path = path + File.separator + dir; new File(destination, path).mkdir(); } } static Map _registerThread_threads = Collections.synchronizedMap(new WeakHashMap()); static Thread _registerThread(Thread t) { _registerThread_threads.put(t, true); return t; } static void _registerThread() { _registerThread(Thread.currentThread()); } }