亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

php實現壓縮文件夾

發布時間:2021-06-03 18:00:53 來源:億速云 閱讀:138 作者:Leah 欄目:開發技術

php實現壓縮文件夾?很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。

優點: 

1. 支持壓縮中文文件名
2. 支持子目錄遞歸壓縮
3. 同zip文件,重復壓縮會合并新增文件,覆蓋原來zip中的交集部分,不刪除目錄下消失的文件,只增不減(自己創建一個目錄,生成只有A和B文件的test.zip,然后增加C文件在目錄,再壓縮成同名test.zip,那么zip里面會有ABC三個文件;如果目錄刪除其他文件,僅保留A文件,生成test.zip不會有改變,里面還是有ABC)

缺點:

1. 單個文件不能壓縮 (todo)
2. 文件夾下,不能僅挑選數個文件進行壓縮(todo)

/**
 * 總接口
 * @param $dir_path 需要壓縮的目錄地址(絕對路徑)
 * @param $zipName 需要生成的zip文件名(絕對路徑)
 */
function zip($dir_path,$zipName){
  $relationArr = [$dir_path=>[
    'originName'=>$dir_path,
    'is_dir' => true,
    'children'=>[]
  ]];
  modifiyFileName($dir_path,$relationArr[$dir_path]['children']);
  $zip = new ZipArchive();
  $zip->open($zipName,ZipArchive::CREATE);
  zipDir(array_keys($relationArr)[0],'',$zip,array_values($relationArr)[0]['children']);
  $zip->close();
  restoreFileName(array_keys($relationArr)[0],array_values($relationArr)[0]['children']);
}

/**
 * 遞歸添加文件進入zip
 * @param $real_path 在需要壓縮的本地的目錄
 * @param $zip_path zip里面的相對目錄
 * @param $zip ZipArchive對象
 * @param $relationArr 目錄的命名關系
 */
function zipDir($real_path,$zip_path,&$zip,$relationArr){
  $sub_zip_path = empty($zip_path)?'':$zip_path.'\\';
  if (is_dir($real_path)){
    foreach($relationArr as $k=>$v){
      if($v['is_dir']){ //是文件夾
        $zip->addEmptyDir($sub_zip_path.$v['originName']);
        zipDir($real_path.'\\'.$k,$sub_zip_path.$v['originName'],$zip,$v['children']);
      }else{ //不是文件夾
        $zip->addFile($real_path.'\\'.$k,$sub_zip_path.$k);
        $zip->deleteName($sub_zip_path.$v['originName']);
        $zip->renameName($sub_zip_path.$k,$sub_zip_path.$v['originName']);
      }
    }
  }
}

/**
 * 遞歸將目錄的文件名更改為隨機不重復編號,然后保存原名和編號關系
 * @param $path 本地目錄地址
 * @param $relationArr 關系數組
 * @return bool
 */
function modifiyFileName($path,&$relationArr){
  if(!is_dir($path) || !is_array($relationArr)){
    return false;
  }
  if($dh = opendir($path)){
    $count = 0;
    while (($file = readdir($dh)) !== false){
      if(in_array($file,['.','..',null])) continue; //無效文件,重來
      if(is_dir($path.'\\'.$file)){
        $newName = md5(rand(0,99999).rand(0,99999).rand(0,99999).microtime().'dir'.$count);
        $relationArr[$newName] = [
          'originName' => iconv('GBK','UTF-8',$file),
          'is_dir' => true,
          'children' => []
        ];
        rename($path.'\\'.$file, $path.'\\'.$newName);
        modifiyFileName($path.'\\'.$newName,$relationArr[$newName]['children']);
        $count++;
      }
      else{
        $extension = strchr($file,'.');
        $newName = md5(rand(0,99999).rand(0,99999).rand(0,99999).microtime().'file'.$count);
        $relationArr[$newName.$extension] = [
          'originName' => iconv('GBK','UTF-8',$file),
          'is_dir' => false,
          'children' => []
        ];
        rename($path.'\\'.$file, $path.'\\'.$newName.$extension);
        $count++;
      }
    }
  }
}

/**
 * 根據關系數組,將本地目錄的文件名稱還原成原文件名
 * @param $path 本地目錄地址
 * @param $relationArr 關系數組
 */
function restoreFileName($path,$relationArr){
  foreach($relationArr as $k=>$v){
    if(!empty($v['children'])){
      restoreFileName($path.'\\'.$k,$v['children']);
      rename($path.'\\'.$k,iconv('UTF-8','GBK',$path.'\\'.$v['originName']));
    }else{
      rename($path.'\\'.$k,iconv('UTF-8','GBK',$path.'\\'.$v['originName']));
    }
  }
}

看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

php
AI

涟水县| 吴桥县| 响水县| 南澳县| 汤原县| 隆化县| 普格县| 宁安市| 巧家县| 绥芬河市| 城固县| 宜春市| 乌拉特前旗| 丰原市| 奉节县| SHOW| 勃利县| 宜城市| 沐川县| 万山特区| 伊吾县| 昂仁县| 中宁县| 富顺县| 岑巩县| 远安县| 沅江市| 长汀县| 兴安盟| 佛坪县| 武宁县| 贡山| 邹平县| 徐州市| 子长县| 永靖县| 陆河县| 阜新| 新乡市| 东乌| 静安区|