2013-08-20 54 views
2

我有這樣的目錄結構:壓縮zip文件破壞目錄結構

members/ 
    login.php 
    register.php 

我壓縮它們通過PHP ZipArchive在我的Windows機器,但是當我把它上傳到Linux主機,並提取有通過PHP它給了我這兩個文件,沒有目錄:

members\login.php 
members\register.php 

我想有主機上的完整目錄結構解壓縮後的文件。 請注意,這個解包代碼在我的本地機器中運行時沒有任何問題。是關於Windows和Linux或什麼的?我該如何解決它?

+0

您是否證實存檔確實具有預期的目錄?你用什麼方法來解壓縮它?顯示你的代碼。 – marekful

+0

是的,它在本地主機上運行良好,它內部有目錄,下面是我的代碼:$ zip = new ZipArchive; if($ zip-> open(「module/$ file [name]」)=== TRUE){$ zip-> extractTo('module /'); } – Alireza

+0

@Alireza我根據你的代碼更新了我的答案。讓我知道。 – flangofas

回答

0

問題解決了!這是我做的: 更改創建zip文件的代碼到這個功能從php.net用戶評論:

function addFolderToZip($dir, $zipArchive){ 
    if (is_dir($dir)) { 
     if ($dh = opendir($dir)) { 
      //Add the directory 
      $zipArchive->addEmptyDir($dir); 
      // Loop through all the files 
      while (($file = readdir($dh)) !== false) { 
       //If it's a folder, run the function again! 
       if(!is_file($dir . $file)){ 
        // Skip parent and root directories 
        if(($file !== ".") && ($file !== "..")){ 
         addFolderToZip($dir . $file . "/", $zipArchive); 
        } 
       }else{ 
        // Add the files 
        $zipArchive->addFile($dir . $file); 
       } 
      } 
     } 
    } 
} 
$zip = new ZipArchive; 
$zip->open("$modName.zip", ZipArchive::CREATE); 
addFolderToZip("$modName/", $zip); 
$zip->close(); 

,然後在主機我寫的只是這個代碼來解開壓縮文件:

copy($file["tmp_name"], "module/$file[name]"); 
$zip = new ZipArchive; 
if ($zip->open("module/$file[name]") === TRUE) { 
    $zip->extractTo('module/'); 
} 
$zip->close(); 

它創建了文件夾和子文件夾。剩下的唯一問題是它會提取主文件夾中所有子文件夾中的每個文件,因此子文件夾中每個文件都有兩個版本。

0

PHP實際上並未提供提取包括其目錄結構的ZIP的函數。我發現在手冊中用戶註釋下面的代碼:

function unzip($zipfile) 
{ 
    $zip = zip_open($zipfile); 
    while ($zip_entry = zip_read($zip)) { 
     zip_entry_open($zip, $zip_entry); 
     if (substr(zip_entry_name($zip_entry), -1) == '/') { 
      $zdir = substr(zip_entry_name($zip_entry), 0, -1); 
      if (file_exists($zdir)) { 
       trigger_error('Directory "<b>' . $zdir . '</b>" exists', E_USER_ERROR); 
       return false; 
      } 
      mkdir($zdir); 
     } 
     else { 
      $name = zip_entry_name($zip_entry); 
      if (file_exists($name)) { 
       trigger_error('File "<b>' . $name . '</b>" exists', E_USER_ERROR); 
       return false; 
      } 
      $fopen = fopen($name, "w"); 
      fwrite($fopen, zip_entry_read($zip_entry, zip_entry_filesize($zip_entry)), zip_entry_filesize($zip_entry)); 
     } 
     zip_entry_close($zip_entry); 
    } 
    zip_close($zip); 
    return true; 
} 

來源here

+0

謝謝,但它看起來不利於開發人員!我在本地主機上使用相同的代碼,並且它返回目錄結構 – Alireza

+0

開發者友好與否,只要我可以發現它是除了使用第三方類或腳本之外唯一的選項。這本質上是一回事。至於在本地工作:Linux和Windows之間的區別我猜。 –

0

嘗試DIRECTORY_SEPARATOR

,而不是使用的:

$ PATH = $ someDirectory '/' $ someFile;

使用:

$ PATH = $ someDirectory。 DIRECTORY_SEPARATOR。$ someFile;

你的代碼改成這樣:

$郵編=新ZipArchive;
if($ zip-> open(「module。DIRECTORY_SEPARATOR。$ file [name]」)=== TRUE){
$ zip-> extractTo('module。DIRECTORY_SEPARATOR');
}

它對兩種操作系統都適用。

祝你好運,

+0

謝謝,我在主機上測試過它,但仍然有同樣的問題 – Alireza