2012-07-23 68 views
1

我試圖在不提取它的情況下顯示zip文件的文件和目錄內容。 Zip庫沒有安裝PHP,我沒有安裝它的權限。列出zip文件的文件和目錄內容

我現在想解析unzip -l <zipfile>的輸出以獲得壓縮文件的目錄結構以及其他文件信息。我可以通過逐行解析結果來輕鬆獲取文件信息。 但是,我發現很難將它轉換爲數組中的目錄結構,因爲我只是php中的新手。結構如下所示(請忽略我只是試圖展示結構的語法)。 子目錄或子文件放在子索引內。

$file[0]['file_name'] = 'dir1', 
$file[0]['children'] = array($subfile[0]['file_name'] = 'subdir1', 
       $subfile[0]['children'] = ....., 
       $subfile[1]['file_name'] = 'subdir1', 
       $subfile[1]['children'] = .....) 
$file[1]['file_name'] = 'dir2', 
$file[1]['children'] = array($subfile[0]['file_name'] = 'subdir1', 
       $subfile[0]['children'] = ....., 
       $subfile[1]['file_name'] = 'subdir1', 
       $subfile[1]['children'] = .....) 

以下是unzip -l <zipfile>的輸出示例。

12363 08-18-2010 13:07 lsmaps/aka.gif 
10299 03-10-2010 12:34 lsmaps/aob.gif 
26095 03-10-2010 12:34 lsmaps/cba.gif 

你知道更好的方法嗎?

感謝

回答

0

pclzip純PHP(讀:你可以將文件到您的項目中複製)的讀者和作家的拉鍊,這樣的:

require_once('pclzip.lib.php'); 
$archive = new PclZip('zipfile.zip'); 
var_export($archive->listContent()); 

到平面信息轉換成樹,你可以使用下面的輔助函數:

function flatToTree($flat) { 
    $res = array(); 
    foreach ($flat as $e) { 
     $parent =& $res; 
     $path = explode('/', $e['filename']); 
     for ($i = 0;$i < count($path) - 1;$i++) { 
      if (! array_key_exists($path[$i], $parent)) { 
       $parent[$path[$i]] = array('file_name'=>$path[$i], 
              'children'=>array()); 
      } 
      $parent =& $parent[$path[$i]]['children']; 
     } 
     $basename = $path[count($path)-1]; 
     if ($basename != '') { // A file, not a directory 
      $parent[$basename] = array('file_name' => $path[$i]); 
     } 
    } 
    return $res; 
} 
var_export(flatToTree($archive->listContents())); 

注意,它使用關聯數組(或字典/圖)爲允許吶的文件訪問速度我。你仍然可以用foreach來迭代它。但是,如果您必須有數字數組,只需在每個元素上調用array_values即可。

+0

謝謝@phihag!我已經可以解析這些信息了。我的問題是將數據安排到類似於我在我的問題中提供的示例的數組中。 – artsylar 2012-07-23 08:09:55

+0

@artsylar使用輔助函數進行擴展。 – phihag 2012-07-23 08:37:46

+0

它現在正在工作!非常感謝你的幫助@ PHPhag! – artsylar 2012-07-23 10:26:59