Команда для распаковки определенной папки с помощью 7zip

Я работаю с окнами, чтобы быть более конкретным, я вызываю команду cmd из java-программы, используя процесс и getRuntime().exec(). Я пробовал такие варианты, как -r, но это не работает. Я попробовал строку кода

Process proc = prog.exec(System.getenv("ProgramFiles").concat("\\7-Zip\\7z x " + "\""+inputZIPFile+"\""+ " -o"+outputFolder+"SpecificFolder\\* -r"));

заранее спасибо


person Siva Hari    schedule 02.07.2014    source источник
comment
Что именно не работает. Покажите трассировку ошибки/стека. Возможно, вы захотите использовать Apache Commons Exec (commons.apache.org/proper/commons-exec), чтобы сделать вашу жизнь проще.   -  person BetaRide    schedule 02.07.2014
comment
Ошибок не обнаружено. Но конкретная папка, которую я хочу извлечь, объединяется с выходной папкой, и туда извлекается весь почтовый индекс.   -  person Siva Hari    schedule 02.07.2014


Ответы (2)


Начните с использования ProcessBuilder вместо этого. Он лучше обрабатывает параметры с пробелами и позволяет вам делать такие вещи, как перенаправление выходного потока и указание начального каталога для команды...

public static void main(String[] args) {
    ProcessBuilder pb = new ProcessBuilder(
        System.getenv("ProgramFiles") + "/7-Zip/7z.exe",
            "x",
            inputZIPFile,
            "-o" + outputFolder+"/SpecificFolder",
            "-r"
    );
    pb.redirectError();
    try {
        Process p = pb.start();
        new Thread(new InputConsumer(p.getInputStream())).start();
        System.out.println("Exited with: " + p.waitFor());
    } catch (Exception ex) {
        ex.printStackTrace();
    }
}

public static  class InputConsumer implements Runnable {
    private InputStream is;

    public InputConsumer(InputStream is) {
        this.is = is;
    }

    @Override
    public void run() {
        try {
            int value = -1;
            while ((value = is.read()) != -1) {
                System.out.print((char) value);
            }
        } catch (IOException exp) {
            exp.printStackTrace();
        }
        System.out.println("");
    }

}

Вы также можете рассмотреть Apache Commons Compress, который обеспечивает поддержку чтения для 7zip.

person MadProgrammer    schedule 02.07.2014
comment
Привет, я получаю exited with 2 - person Siva Hari; 02.07.2014
comment
Это бесполезно, но, видимо, 2 - фатальная ошибка: P - person MadProgrammer; 02.07.2014
comment
Вы проверили команду в командной строке, чтобы убедиться, что она работает? - person MadProgrammer; 02.07.2014
comment
только что проверил, что он не работает .. есть ли у вас какие-либо идеи о cmd для извлечения определенной папки из почтового индекса .. ?? - person Siva Hari; 02.07.2014
comment
Ну, у меня сработала команда, мой пример кода, протестировал ее локально - person MadProgrammer; 02.07.2014
comment
Извлекает ли он только указанную папку из inputZIPFile? - person Siva Hari; 02.07.2014
comment
7z x " + input +" -o" + output +" *\SpecificFolder\*.*, по сути, последний параметр - это файлы, которые нужно извлечь... - person MadProgrammer; 02.07.2014
comment
Сделал небольшое изменение в вашем коде, и он сработал new ProcessBuilder(System.getenv("ProgramFiles") + "/7-Zip/7z.exe","x",inputZIPFile,"-o" + outputFolder,"specifiedFolder/*","-r");, но он не завершается, я должен принудительно остановить его. - person Siva Hari; 02.07.2014
comment
В своем первом сообщении я забыл start ветку для потребителей, new Thread(new InputConsumer(p.getInputStream())).start();... вы используете этот обновленный код? - person MadProgrammer; 02.07.2014
comment
Да, мне потребовалось несколько минут, чтобы понять это :P - person MadProgrammer; 02.07.2014

Почему бы не разархивировать с помощью java? Из Сжатие и распаковка данных с помощью Java API:

import java.io.*;
import java.util.zip.*;

public class UnZip {
   final int BUFFER = 2048;
   public static void main (String argv[]) {
      try {
         BufferedOutputStream dest = null;
         FileInputStream fis = new 
       FileInputStream(argv[0]);
         ZipInputStream zis = new 
       ZipInputStream(new BufferedInputStream(fis));
         ZipEntry entry;
         while((entry = zis.getNextEntry()) != null) {
            System.out.println("Extracting: " +entry);
            int count;
            byte data[] = new byte[BUFFER];
            // write the files to the disk
            FileOutputStream fos = new 
          FileOutputStream(entry.getName());
            dest = new 
              BufferedOutputStream(fos, BUFFER);
            while ((count = zis.read(data, 0, BUFFER)) 
              != -1) {
               dest.write(data, 0, count);
            }
            dest.flush();
            dest.close();
         }
         zis.close();
      } catch(Exception e) {
         e.printStackTrace();
      }
   }
}
person DavidPostill    schedule 02.07.2014
comment
Потому что, если это не настоящий zip-файл, это не сработает, просто говорю;) - person MadProgrammer; 02.07.2014