2013-02-15 6 views
0

Я пытаюсь расширить zip-файл с помощью 7zip, но я продолжаю получать распечатку использования 7zip.Расширение файлов с 7zip

почтовый индекс существует в C: \ TEMP

Той же команда успеха в пакетном окне:

C:\TEMP>7z x "tryThis.zip" 

Я пытался добавить путь Workdir к файлу, а также без рабочей директории, ничего Помогите. - Возможно, я могу запустить это с помощью команды CMD/c, но я предпочитаю держать код в чистоте.

Что я делаю неправильно?

Спасибо!

String pathTo7ZipExe = "c:\\program files\\7-zip\\7z.exe"; 
String fileName ="tryThis.zip"; 
String workingDir = "c:\\temp\\"; 

Process process = Runtime.getRuntime().exec(
            new String[]{pathTo7ZipExe}, 
            new String[]{" x \"" + fileName +"\""}, 
            new File(workingDir)); 

BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream())); 
String line; 
while ((line = in.readLine()) != null) { 
     System.out.println(line); 
} 
// wait for zip to end. 
int exitVal = process.waitFor(); 

ответ

6

Пожалуйста, посмотрите на Runtime.exec для справки о

Что вы на самом деле пытаетесь сделать зовёт 7-Zip без аргументов и предоставляя аргументы в качестве среды. Окружающая среда является чем-то вроде Windows, PATH и т.д.

так что вы, вероятно, хотите сделать что-то вроде:

Runtime.getRuntime().exec(new String[]{pathToZipExe, "x", fileName}, null, new File(workingDir)); 

С другой стороны, я бы настоятельно советую взглянуть на ZipInputStream, который включен в Java - с помощью что вы также можете распаковать zip-файлы.

Приветствие

+0

Спасибо! этот работает для меня. – user648026

+0

Отлично! - btw [this] (http://www.kodejava.org/examples/334.html) будет решением с ZipInputStream java. Одно из преимуществ заключается в том, что вы можете специально искать элементы, не распаковывая весь архив. –

1

Вы вызывая перегрузку exec, которая принимает envp массива в качестве второго аргумента. Этот массив envp не для аргументов вообще, поэтому на самом деле вы не передаете никаких аргументов: именно поэтому вы получаете распечатку использования.

Цитаты и пространства не являются сами по себе часть аргументов: они используются для разделения на argv (с небольшими оговорками, это также верно для Windows: вот как CommandLineToArgW работает, даже если полный оригинал командной строки с кавычками и пространства всегда доступный).

Так оно и должно быть что-то вроде этого:

Runtime.getRuntime().exec(new String[]{pathTo7ZipExe, "x", fileName}, 
        new String[]{}, new File(workingDir)); 

(слишком плохо, я не знаю Java, так что код может быть unidiomatic, но он должен работать).

+0

Одна небольшая проблема с окружением: null наследует исходную среду, новый 'String [] {}' даст пустую среду (нет набора PATH и т. Д.) - не уверен, что это то, что нужно. –

Смежные вопросы