微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用 PHP 量化大型档案中的文件

如何解决使用 PHP 量化大型档案中的文件

我想做什么

我正在处理大小在 1 GB 到 5 GB 之间的档案(zip 和 tar 格式)。每个存档包含数万个文件;有时超过 100,000 个文件。这些文件分布在各种嵌套目录中。

我试图准确地确定给定存档(tar 或 zip)中有多少文件,而无需提取存档的内容,或者(如果我可以避免的话)将整个存档加载到内存中那些。如果有流媒体选项,那就太好了。

我尝试了什么

对于 zip 档案,这似乎相当简单:

$archive = new ZipArchive;
$archive->open( "archive.zip" );
$archive->count(); // Or,alternatively,$archive->numFiles;

然而,在处理 tar 档案时,这会变得有点困难。在 PharData 类中有一个很好的方法来处理这两种类型的档案,但它不会报告超过 65535 个文件

$archive = new PharData( "archive.tar",Phar::TAR );
$archive->count();

除上述之外,我还尝试了 phar:// 协议,递归量化目录及其子目录中的文件数量。但是,这似乎也没有 ZipArchive::count 那样可靠:

$path = "archive.zip";
$phar = "phar://$path";

function count_files ( $dir ) {
    $total = 0;
    if ( $handle = opendir( $dir ) ) {
        while ( false !== ( $file = readdir( $handle ) ) ) {
            if ( in_array( $file,[ ".",".." ] ) ) {
                continue;
            }
            if ( is_dir( $dir . "/" . $file ) ) {
                $total += count_files( $dir . "/" . $file );
            } else {
                $total += 1;
            }
        }
        closedir( $handle );
    }
    return $total;
}

在上面,count_files( $phar ) 返回 60,115,而 ZipArchive::count 返回 105,497。

更复杂的是,在提取存档时,Windows 资源管理器(通过文件属性)指出有 96,525 个文件(和 8,972 个文件夹)(更新:count_files 也说 96,525存档目录)。该数量与上述示例中的任何一个结果都不相同。当我尝试使用 PowerShell 量化文件数(在提取的目录中)时,我得到了另一个独特的结果:96,498(比 Windows 的 Shell 报告的少 27 个):

(Get-ChildItem -Recurse -File | Measure-Object).Count

环境详情

我正在 Windows 10 上测试这个,使用 PHP 8.0.0 (cli) (NTS Visual C++ 2019 x64)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。