Java выборочно копирует файлы из zip-файла так, чтобы временная метка файла была сохранена - PullRequest
0 голосов
/ 22 января 2019

Я следовал следующему подходу, чтобы распаковать zip с помощью apache commons compress :

Но так как я использую OutputStream & IOUtils.copy(ais, os); (код ниже) чтобы распаковать и скопировать файл, временная метка не сохраняется.Есть ли другой способ напрямую скопировать файл из zip-файла, чтобы сохранить временную метку файла.

try (ArchiveInputStream ais =
         asFactory.createArchiveInputStream(
           new BufferedInputStream(
             new FileInputStream(archive)))) {

        System.out.println("Extracting!");
        ArchiveEntry ae;
        while ((ae = ais.getNextEntry()) != null) {
            // check if file needs to be extracted {}
            if(!extract())
                continue;

            if (ae.isDirectory()) {
                File dir = new File(archive.getParentFile(), ae.getName());
                dir.mkdirs();
                continue;
            }

            File f = new File(archive.getParentFile(), ae.getName());
            File parent = f.getParentFile();
            parent.mkdirs();
            try (OutputStream os = new FileOutputStream(f)) {
                IOUtils.copy(ais, os);
                os.close();
            } catch (IOException innerIoe) {
                ...
            }
        }

        ais.close();
        if (!archive.delete()) {
            System.out.printf("Could not remove archive %s%n",
                               archive.getName());
            archive.deleteOnExit();
        }
    } catch (IOException ioe) {
        ...
    }

РЕДАКТИРОВАТЬ: С помощью jbx's ответа ниже, следующее изменение заставит его работать.

IOUtils.copy(ais, os);
os.close();
outFile.setLastModified(entry.getLastModifiedTime().toMillis()); // this line

1 Ответ

0 голосов
/ 22 января 2019

Вы можете установить атрибут файла lastModifiedTime, используя NIO. Сделайте это с файлом точно после того, как вы его напишите (после того, как закроете) .Операционная система помечала бы свое последнее измененное время к текущему времени в тот момент

https://docs.oracle.com/javase/tutorial/essential/io/fileAttr.html

Вам понадобится получить время последнего изменения из zip-файла, поэтому, возможно, использование ZIO Filesystem Provider` для просмотра и извлечения файлов из архива будет лучше, чем ваше.текущий подход (если используемые вами API не предоставляют вам ту же информацию).

https://docs.oracle.com/javase/7/docs/technotes/guides/io/fsp/zipfilesystemprovider.html

...