2017-08-31 344 views
0

我有一個PHP腳本,使拉鍊帶2個功能:在PHP中,這個錯誤意味着什麼:Warning:ZipArchive :: close():讀取錯誤:錯誤的文件描述符在(...)中?

  1. dirToArray:讓所有的文件/ empty_folders陣列中的
  2. create_zip:調用dirToArray(),使zipArchive

我得到了一個奇怪的警告,它實際上是一個真正的錯誤,因爲我的zip檔案沒有被構建。

警告結果

Warning: ZipArchive::close(): Read error: Bad file descriptor in path/to/file.php on line x

有人可以解釋我是什麼意思: 「錯誤的文件描述符」?

這是代碼:

dirToArray

/* to copy all file/folder names from a directory into an array*/ 
function dirToArray($dir_path) { 
    $result = array(); 
    $path = realpath($dir_path); 
    $objects = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($path), \RecursiveIteratorIterator::SELF_FIRST); 
    foreach($objects as $name => $object) { 
     if($object->getFilename() !== "." && $object->getFilename() !== "..") { 
      $result[] = $object; 
     } 
    } 
    return $result; 
} 

create_zip

/* creates a compressed zip file */ 
function create_zip($productPath = '', $dirName = '', $overwrite = false) { 
    $fullProductPath = $productPath.$dirName; 
    $a_filesFolders = dirToArray($fullProductPath); 
    var_dump($a_filesFolders); 
    //if the zip file already exists and overwrite is false, return false 
    $zip = new \ZipArchive(); 
    $zipProductPath = $fullProductPath.'.zip'; 
    if($zip->open($zipProductPath) && !$overwrite){ 
     $GLOBALS["errors"][] = "The directory {$zipProductPath} already exists and cannot be removed."; 
    } 

    //if files were passed in... 
    if(is_array($a_filesFolders) && count($a_filesFolders)){ 
     $opened = $zip->open($zipProductPath, \ZipArchive::CREATE | \ZipArchive::OVERWRITE); 
     if($opened !== true){ 
      $GLOBALS["errors"][] = "Impossible to open {$zipProductPath} to edit it."; 
     } 

     //cycle through each file 
     foreach($a_filesFolders as $object) { 
      //make sure the file exists 
      $fileName = $object -> getFilename(); 
      $pathName = $object -> getPathname(); 
      if(file_exists($pathName)) { 
       $pos = strpos($zipProductPath , "/tmp/") + 5; 
       $fileDestination = substr($pathName, $pos); 
       echo $pathName.'<br/>'; 
       echo $fileDestination.'<br/>'; 
       $zip->addFile($pathName,$fileDestination); 
      } 
      else if(is_dir($pathName)){ 
       $pos = strpos($zipProductPath , "/tmp/") + 5; 
       $fileDestination = substr($pathName, $pos); 
       $zip->addEmptyDir($fileDestination); 
      }else{ 
       $GLOBALS["errors"][] = "the file ".$fileName." does not exist !"; 
      } 
     } 

     //close the zip -- done! 
     $zip->close(); 
     //check to make sure the file exists 
     return file_exists($zipProductPath); 
    }else{ 
     return false; 
    } 
} 
+0

我的猜測是,打電話給'的open()'失敗,然後您嘗試關閉描述符,因爲它一直沒有拉開 –

+0

我不存在檢查:if($ opened!== true){GLOBALS [「errors」] [] =「無法打開{$ zipProductPath}進行編輯。 } –

+0

是的,但它不會停止腳本的執行 –

回答

0

我發現這個問題......我用file_exists()混淆函數檢測是否存在目錄...所以腳本將文件夾添加爲文件併發出錯誤。

create_zip(修補)

/* creates a compressed zip file */ 
function create_zip($productPath = '', $dirName = '', $overwrite = false) { 
    $fullProductPath = $productPath.$dirName; 
    $a_filesFolders = dirToArray($fullProductPath); 
    var_dump($a_filesFolders); 
    //if the zip file already exists and overwrite is false, return false 
    $zip = new \ZipArchive(); 
    $zipProductPath = $fullProductPath.'.zip'; 

    if($zip->open($zipProductPath) && !$overwrite){ 
     $GLOBALS["errors"][] = "The directory {$zipProductPath} already exists and cannot be removed."; 
     return false; 
    } 
    //if files were passed in... 
    if(is_array($a_filesFolders) && count($a_filesFolders)){ 
     $opened = $zip->open($zipProductPath, \ZipArchive::CREATE | \ZipArchive::OVERWRITE); 
     if($opened !== true){ 
      $GLOBALS["errors"][] = "Impossible to open {$zipProductPath} to edit it."; 
      return false; 
     }else{ 
      //cycle through each file 
      foreach($a_filesFolders as $object) { 
       //make sure the file exists 
       $fileName = $object -> getFilename(); 
       $pathName = $object -> getPathname(); 
       if(is_dir($pathName)){ /*<-- I put on first position*/ 
        $pos = strpos($zipProductPath , "/tmp/") + 5; 
        $fileDestination = substr($pathName, $pos); 
        $zip->addEmptyDir($fileDestination); 
       }else if(file_exists($pathName)) { 
        $pos = strpos($zipProductPath , "/tmp/") + 5; 
        $fileDestination = substr($pathName, $pos); 
        $zip->addFile($pathName,$fileDestination); 
       } 
       else{ 
        $GLOBALS["errors"][] = "the file ".$fileName." does not exist !"; 
       } 
      } 

      //close the zip -- done! 
      $zip->close(); 
      //check to make sure the file exists 
      return file_exists($zipProductPath); 
     } 
    }else{ 
     return false; 
    } 
} 
相關問題