Назовите папку Zip с именем файла ZIP - PullRequest
0 голосов
/ 28 декабря 2011

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

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

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 Ответ

1 голос
/ 28 декабря 2011

Я бы изменил ваш 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
...