使用PHP ZipArchive从ZIP文件中提取的文件保留修改日期。

4

我正在使用ZipArchive从ZIP文件中提取文件。

这是我正在使用的代码

$zip = new ZipArchive;
$res = $zip->open($file);
if ($res === TRUE) {
    $zip->extractTo('test/');
    $zip->close();
}

它的运行正常,但是提取文件的最后修改日期会变为当前时间。

我该如何保留提取文件的原始最后修改日期?

4个回答

6
我改进了Badal的答案,使其适用于ZIP文件中的所有文件(目录仍将保留当前时间戳)。
$res = $zip->open($filename);
if($res === true) {
    $zip->extractTo($dataDir);

    for($i=0; $i<$zip->numFiles; $i++){
        touch($dataDir . $zip->statIndex($i)['name'], $zip->statIndex($i)['mtime']);
    }

    $zip->close();
}
$dataDir 需要以斜杠结尾。

我使用了这个脚本,目录时间戳也被更新了(使用PHP 7.3.12)。 - Goozak

4
我通过使用ZipArchive::statIndex提供的mtime值找到了一种方法。
它可以在解压缩后更改已提取文件的修改日期。
以下是最终代码:
$zip = new ZipArchive;
$res = $zip->open($file);
if ($res === TRUE) {
    $filename = $mtime = $zip->statIndex(0)['name'];
    $zip->extractTo('test/');
    touch('test/'.$filename, $zip->statIndex(0)['mtime']); // Change the modified date of the extracted file.
    $zip->close();
}

实际上,这只更改第一个文件(索引为0),您需要循环所有文件以应用于整个zip。 - the_nuts

0

关于这个问题有一个未解决的bug,并且有一个拉取请求来修复它,但尚未被应用


0
在zip存档中,日期和时间以标准MS-DOS格式编码(https://pkware.cachefly.net/webdocs/casestudies/APPNOTE.TXT)。这意味着日期和时间是根据创建zip存档的系统的本地时间来确定的。
statIndex返回的mtime假定创建zip存档的系统的本地时间为UTC(GMT),这很少是真实的情况。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接