Права доступа к файлам не сохраняются при разархивировании tar.gz - PullRequest
0 голосов
/ 18 мая 2018

Я пытаюсь разархивировать файл tar.gz с использованием библиотеки Apache Compress в Linux с Java.

Как сохранить права доступа к файлам с помощью библиотеки Apache Compress при разархивировании tar.gz?

public void run(ByteTransferCallback callback) throws IOException
{
    this.entries = new HashSet<>();


    try (TarArchiveInputStream tarArchiveInputStream = new TarArchiveInputStream(
            new GzipCompressorInputStream(new BufferedInputStream(new FileInputStream(this.tarGZipFile)))))
    {
        TarArchiveEntry entry = null;

        while ((entry = tarArchiveInputStream.getNextTarEntry()) != null)
        {
            if (entry.getName().startsWith(this.tarGZipPath))
            {
                boolean cancelled = !unarchiveEntry(tarArchiveInputStream, entry, callback);
                if (cancelled) break;
            }
        }

    }

}


protected boolean unarchiveEntry(TarArchiveInputStream tar, TarArchiveEntry 
     entry, ByteTransferCallback callback) throws IOException
{
    File entryDestination = new File(this.destination, 
    entry.getName().replaceFirst(this.tarGZipPath, ""));

    entryDestination.getParentFile().mkdirs();

    this.entries.add(entryDestination);

    boolean result = false;

    if (entry.isDirectory())
    {
        entryDestination.mkdirs();
        result = true;
    }
    else
    {
        result = unarchiveFileEntry(tar, entry, entryDestination, callback);
    }

    return result;
}



protected boolean unarchiveFileEntry(TarArchiveInputStream tar, 
TarArchiveEntry entry, File destination, ByteTransferCallback callback) 
throws IOException
{
        try(OutputStream out = new FileOutputStream(destination))
        {
            return copy(tar, out, callback);
        }
}


protected boolean copy(InputStream in, OutputStream out, 
ByteTransferCallback callback) throws IOException
{
    int numBytes = 0;
    byte[] buffer = new byte[DEFAULT_BUFFER_SIZE];

    boolean cancelled = false;

    while (EOF != (numBytes = in.read(buffer)) && !cancelled)
    {
        out.write(buffer, 0, numBytes);
        cancelled = !callback.onBytesTransferred(numBytes);
    }

    return !cancelled;
}

Из каждой записи я могу получить разрешение в формате Unix, используя TarArchiveEntry.getMode (), но как я могу установить его для каждого неархивированного файла?

1 Ответ

0 голосов
/ 18 мая 2018

В Linux / Unix обычный пользователь не может передать право собственности на объект файловой системы другому пользователю.Может только root (UID 0).В этом случае ваша программа должна быть запущена как root, и вам нужно использовать системный вызов chown() и связанный с ним (см. man 2 chown).

Для прав доступа к файлу, времени и даты вам необходимоиспользуйте системный вызов utime() и связанные с ним (см. man 2 utime).

Это можно сделать из Java с помощью методов, доступных в java.io.File, таких как setExecutable, setReadable и setWritable,Пожалуйста, обратитесь к официальной документации для деталей.

...