Php保留从zip中提取的文件的修改日期

时间:2015-11-25 07:13:47

标签: php zip ziparchive

我正在使用ZipArchive从zip

中提取文件

这是我正在使用的代码

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

它工作正常,但提取文件的最后修改日期会更改为当前时间。

如何保留提取文件的原始上次修改日期?

4 个答案:

答案 0 :(得分:3)

我找到了一种使用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();
}

答案 1 :(得分:2)

我改进了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();
}

答案 2 :(得分:0)

有一个open bug关于此问题,并提出修复请求,但尚未应用

答案 3 :(得分:0)

在zip档案中,日期和时间以标准MS-DOS格式(https://pkware.cachefly.net/webdocs/casestudies/APPNOTE.TXT)编码。这意味着日期和时间取决于创建zip归档文件的系统的本地时间。

statIndex返回的mtime假定创建zip归档文件的系统的本地时间为UTC(GMT),