【问题标题】:Php keep the modified date of files extracted from the zipphp保留从zip中提取的文件的修改日期
【发布时间】:2015-11-25 07:13:46
【问题描述】:

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

这是我正在使用的代码

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

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

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

【问题讨论】:

    标签: php zip ziparchive


    【解决方案1】:

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

    【讨论】:

    • 我使用了这个脚本,并且目录时间戳更新了(使用 PHP 7.3.12)。
    【解决方案2】:

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

    【讨论】:

    • 其实这只改变了第一个文件,(index=0),需要循环所有文件才能应用到整个zip
    【解决方案3】:

    有一个 open bug 与此相关的请求请求修复它,但它尚未应用

    【讨论】:

      【解决方案4】:

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

      statIndex 返回的 mtime 假定创建 zip 存档的系统的本地时间是 UTC (GMT),这很少是真的。

      【讨论】:

        猜你喜欢
        • 2012-04-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-28
        相关资源
        最近更新 更多