簡體   English   中英

Php RecursiveIteratorIterator 通過 tarball 保持原始文件順序

[英]Php RecursiveIteratorIterator through tarball keeping original file order

在 tarball 文件中,文件按被推入的時間排序。在下面的示例中,它們不是按字母順序排序,而是按推入順序排序。

# tar tvf file.tgz
-rw-r--r-- 0/0       962 2023-01-17 13:40:17 6fe3b8b5-a4dc-4976-bea9-227434c11cda
-rw-r--r-- 0/0       962 2023-01-17 13:40:17 febe009e-8ce0-4027-abda-e27f5f949dde
-rw-r--r-- 0/0       962 2023-01-17 13:40:17 4fea07a6-a90c-4cb4-9969-4cac08422ccf
-rw-r--r-- 0/0       962 2023-01-17 13:40:17 01610297-c577-4e6c-9ce9-7825a40e6d0c
-rw-r--r-- 0/0       962 2023-01-17 13:40:26 01b498ca-3d87-426b-b01d-d4e75921cb00
-rw-r--r-- 0/0       962 2023-01-17 13:40:26 45821111-f69d-4331-87d8-f3afd9918c91

令人驚訝的是,當使用 PHP 8.1 RecursiveIteratorIterator閱讀上面的 tarball 時,它們是按字母順序迭代的。

$p = new PharData($path);
foreach (new RecursiveIteratorIterator($p) as $file) {
    echo $file . "\n";
}

上面的代碼導致下面的 output:

phar:///path/to/file/01610297-c577-4e6c-9ce9-7825a40e6d0c
phar:///path/to/file/01b498ca-3d87-426b-b01d-d4e75921cb00
phar:///path/to/file/45821111-f69d-4331-87d8-f3afd9918c91
phar:///path/to/file/4fea07a6-a90c-4cb4-9969-4cac08422ccf
phar:///path/to/file/6fe3b8b5-a4dc-4976-bea9-227434c11cda
phar:///path/to/file/febe009e-8ce0-4027-abda-e27f5f949dde

PHP 中有沒有一種方法可以按原始順序迭代 tarball 內容?

我相信這是由PharData class 而不是RecursiveIteratorIterator引起的。 您可以通過首先轉換為數組,然后在您想要的任何字段上使用usort()來強制進行自己的排序:

$p = new PharData(...);
$files = iterator_to_array($p);
usort($files, fn($a, $b) => $a->getMTime() <=> $b->getMTime());
foreach ($files as $file) {
    printf("%s %s\n", $file->getPathname(), $file->getMTime());
}

感謝 Alex Howansky 的回答,我找到了一個基於exec()的有效解決方案,它基本上利用了 tar 排序列表:

$sortedFileList = [];
exec("tar tf $path", $sortedFileList);
$sortedFileList = array_flip($sortedFileList);

$p = new PharData($path);
$files = iterator_to_array($p);
usort($files,
    fn(a, $b) => $sortedFileList[$a->getFilename()] <=> $sortedFileList[$b->getFilename()]
);

foreach ($files as $file) {
    printf("%s %s\n", $file->getPathname(), $file->getMTime());
}

我不太喜歡使用 exec,但實現我的目標的唯一替代方法是向項目添加一些外部庫,並且由於這項工作應該由普通的PharData迭代器完成,我希望將來它會允許以原始順序迭代 tarball 文件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM