如何解决使用 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 举报,一经查实,本站将立刻删除。