1: | <?php |
2: | |
3: | |
4: | |
5: | |
6: | |
7: | |
8: | |
9: | |
10: | |
11: | |
12: | |
13: | |
14: | |
15: | |
16: | |
17: | |
18: | class Zip_Filter extends Archive_Base |
19: | { |
20: | public static function extract_files($archive, $dest, array $file = null, ?array $opts = array()) |
21: | { |
22: | $zip = new ZipArchive(); |
23: | if (!$zip->open($archive)) { |
24: | return error("unable to open archive `%(file)s': %(reason)s", [ |
25: | 'file' => $archive, |
26: | 'reason' => $zip->getStatusString() |
27: | ]); |
28: | } |
29: | $zip->extractTo($dest, $file); |
30: | $zip->close(); |
31: | |
32: | return true; |
33: | } |
34: | |
35: | public static function list_files($archive, ?array $opts = array()) |
36: | { |
37: | $zip = new ZipArchive(); |
38: | if (!$zip->open($archive)) { |
39: | return error("unable to open archive `%(file)s': %(reason)s", [ |
40: | 'file' => $archive, |
41: | 'reason' => $zip->getStatusString() |
42: | ]); |
43: | } |
44: | $files = []; |
45: | $n = $zip->count(); |
46: | for ($i = 0; $i < $n; $i++) { |
47: | $stat = $zip->statIndex($i); |
48: | $name = $stat['name']; |
49: | $files[] = [ |
50: | 'file_name' => $name, |
51: | 'file_type' => $name[-1] === '/' ? 'dir' : 'file', |
52: | 'can_read' => true, |
53: | 'can_write' => true, |
54: | 'can_execute' => true, |
55: | 'size' => !$stat['size'] ? FILESYSTEM_BLKSZ*1024 : $stat['size'], |
56: | 'packed_size' => $stat['comp_size'], |
57: | 'crc' => sprintf("%08X", $stat['crc'] ?? 0), |
58: | 'link' => 0, |
59: | 'date' => $stat['mtime'] |
60: | ]; |
61: | } |
62: | return $files; |
63: | |
64: | } |
65: | } |
66: | |