Как мне обрабатывать длинные имена файлов GNU в Java при использовании классов org.apache.tools.tar. *, Поставляемых с install4j? - PullRequest
0 голосов
/ 09 февраля 2012

Я пытаюсь добавить Run Script для install4j, который обрабатывает распаковку и распаковку тарболлов для таких вещей, как mysql и tomcat, которые встраиваются в мой установщик. Я понимаю, что могу взорвать эти tars как часть процесса сборки в ant, но по крайней мере для одного случая использования я не могу этого сделать.

Я включил приведенный ниже код в действие «Выполнить скрипт», используя классы org.apache.tools.tar.TarEntry и TarInputStream. Это работает довольно хорошо, с одной ошибкой.

При использовании этой реализации пути к файлам, длина которых превышает 99 символов, усекаются, а полученные файлы разбиваются на каталог верхнего уровня.

Я пытаюсь выяснить, является ли это ошибкой в ​​моей реализации или проблемой с классами инструментов Apache. Кажется, tarEntry.getName () не возвращает полный путь, когда он превышает 99 символов. Есть ли простой способ обойти это без необходимости переписывать то, что делает TarInputStream? Tar.Entry имеет метод isGNULongNameEntry, но я не могу найти надежный способ объяснить, куда поместить файл, когда это возвращает true.

Есть предложения?

import java.io.*;
import java.util.zip.*;
import org.apache.tools.tar.TarEntry;
import org.apache.tools.tar.TarInputStream;

String outputDirectory = "mysql";
File tgzFile = new File(context.getInstallationDirectory(), outputDirectory + File.separator + "mysql-5.5.17-linux2.6-i686.tar.gz");

// Create the Tar input stream.
FileInputStream fin = new FileInputStream(tgzFile);
GZIPInputStream gin = new GZIPInputStream(fin);
TarInputStream tin = new TarInputStream(gin);

// Create the destination directory.
File outputDir = new File(outputDirectory);
outputDir.mkdir();

// Extract files.
TarEntry tarEntry = tin.getNextEntry();
while (tarEntry != null) {
    File destPath = new File(context.getInstallationDirectory(), outputDirectory + File.separator + tarEntry.getName());

tarEntry.isGNULongNameEntry()

    if (tarEntry.isDirectory()) {
        destPath.mkdirs();
    } else {
        // If the parent directory of a file doesn't exist, create it.
        if (!destPath.getParentFile().exists())
            destPath.getParentFile().mkdirs();

        FileOutputStream fout = new FileOutputStream(destPath);
        tin.copyEntryContents(fout);
        fout.close();
    // Presserve the last modified date of the tar'd files.
        destPath.setLastModified(tarEntry.getModTime().getTime());
    }
    tarEntry = tin.getNextEntry();
}
tin.close();

return true;

Ответы [ 2 ]

1 голос
/ 09 февраля 2012

Не стесняйтесь смотреть на мой предложенный патч для этой проблемы с муравьями Это может дать вам хотя бы несколько указателей.

0 голосов
/ 10 февраля 2012

Хотя длинные имена файлов в tar-файлах POSIX не обрабатываются библиотекой apache tar, вы можете использовать GNU tar для создания файлов tar.В этом случае не будет проблем с длинными именами файлов.

...