2011-12-27 4 views
0

Я использую TarInputStream() для чтения содержимого tar-файла и хранения всех файлов из него в определенном месте. Я хочу создать папку с именем, аналогичным файлу tar, и сохранить все мои файлы в этой папке. Например, если у меня есть tar-файл test.tar.gz с файлами test1 и test2 в нем, мой код должен создать папку по тесту имени и извлечь файлы tar в эту папку.Назовите папку Zip с именем zip-файла

Вот код, который я написал.

TarInputStream tin = new TarInputStream(new GZIPInputStream(new FileInputStream(new File(tarFileName)))); 

TarEntry tarEntry = tin.getNextEntry(); 
     while (tarEntry != null) {// create a file with the same name as tar entry 

      File destPath = new File(dest.toString() + File.separatorChar 
        + tarEntry.getName()); 

      FileOutputStream fout = new FileOutputStream(destPath); 
       tin.copyEntryContents(fout); 
       fout.close(); 
       ///services/advert/lpa/dimenions/data/advertiser/ 
       Path inputFile = new Path(destPath.getAbsolutePath()); 

       //To remove the local files set the flag to true 
       fs.copyFromLocalFile(inputFile, filenamepath); 
       tarEntry = tin.getNextEntry(); 
} 

ответ

1

Я изменил ваш new File(...) к new File(dest, tarEntry.getName()); (при условии, dest является File - не может видеть, куда он идет из вашего кода).

И самое главное, что вам нужно, чтобы убедиться, что вы создаете каталоги, которые вы пытаетесь создать файлы в этом можно сделать:.

destPath.getParent().mkdirs(); 

.getParent() важно, так как мы не может создать папку для каждой части имени файла, в противном случае имя файла также будет создано как папка вместо файла, а затем попытка записи данных в нее завершится с ошибкой (так как ожидается файл вместо папки что бы существовало).

Для получения "база" lpa_1_454_20111117011749 имя от чего-то, как lpa_1_454_20111117011749.tar.gz:

String tarFileName = "/tmp/lpa_1_454_20111117011749.tar.gz"; 

// Non-regular expression approach: 
{ 
    int lastPath = tarFileName.lastIndexOf('/'); 
    if(lastPath >= 0){ 
     lastPath++; 
    } 
    int endName = tarFileName.length(); 
    if(tarFileName.endsWith(".tar.gz")){ 
     endName -= 7; 
    } 

    String baseName = tarFileName.substring(lastPath, endName); 
    System.out.println(baseName); 
} 

// Regular expression approach: 
{ 
    Pattern p = Pattern.compile("(?:.*/|^)(.*)\\.tar\\.gz"); 
    Matcher m = p.matcher(tarFileName); 
    if(m.matches()){ 
     System.out.println(m.group(1)); 
    } 
} 

Либо подход выходы:

lpa_1_454_20111117011749 
+0

Строка tarFileName = "/ TMP/lpa_1_454_20111117011749.tar.gz"; Файл dest = новый файл ("/ tmp/test /"); Итак, я хочу, чтобы все файлы были извлечены под именем папки lpa_1_454_20111117011749. Но я не могу извлечь это имя! – RFT

+0

Ваш код в сочетании с этим ответом должен достичь того, чего вы ожидаете. Не могли бы вы объяснить, что вы подразумеваете под «неспособным извлечь это имя»? Предполагая, что 'lpa _...' является именем файла в TAR-файле, это должно быть возвращено' tarEntry.getName() 'и в результате получается' destPath' of "/ tmp/test/tmp/lpa _...". Конечно, здесь есть 2-й «tmp», но это действительно единственный «безопасный» способ сделать это - если вы не предоставите возможность отключить известное количество компонентов пути из имен файлов TAR, - но это делает некоторые довольно серьезные предположения о каждом файле TAR, который вы ожидаете обработать. – ziesemer

+0

lpa_ .. является tar-файлом, из которого я извлекаю файлы. Я могу извлечь имена файлов с помощью tarEntry.getName(), но не могу извлечь имя файла tar lpa _... – RFT

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