# # PHPZip v1.2 by Sext (sext@neud .net) 2002 -11-18 # (変更: 2003-03-01) # # zipアーカイブを作成します # # 「Zipファイル作成クラス」をベースに、zLib # # class PHPZipを使用します {function zip($ dir、$ zipfilename) &(!is_array($ dir)&&(file_exists($ dir))chdir($ dir); ); out = $this -> file();
chdir($curdir); fwrite ($ FP, $ OUT, Strlen ($ OUT)); fclose ($ fp); } 1 を返す } それ以外の場合は 0 を返す function getFileList($ dir) { if(file_exists($ dir)) { $ args = func_get_args(); while($files = readdir($dh)) { if (($files!=".")&&($files!="..")) { if (is_d ir($dir.$files) ) { $curdir = getcwd(); chdir($dir.$files); $file = array_merge($file, $this -> GetFileList("", "$pref$files/")); chdir($curdir); } else $file[]=$pref.$files; } } closeir($dh); } return $file; }
var $datasec = array( ); var $ctrl_dir = array(); var $eof_ctrl_dir = "x50x4bx05x06x00x00x00x00"; var $old_offset = 0; /** * Unix タイムスタンプを 4 バイトの DOS 日付と時刻形式に変換します (日付 * 上位 2 バイト、時刻は下位 2 バイトで大小比較が可能)。 * * @param integer 現在の Unix タイムスタンプ * * @現在の日付を整数で 4 バイトの DOS 形式で返します * * @access private */ 関数ix2DosTime($unixtime = 0) { $timearray = ($unixtime == 0) ? getdate() : getdate($unixtime);
if ($timearray['year'] < 1980) { = 1980; $timearray['mon'] = 1; $ timearray['mday'] = 1; $timearray['hours'] = 0; $timearray[' minutes'] = 0; $timearray['秒'] = 0; } // end if
return (($timearray['年'] - 1980) << 25) | ($timearray['mon'] << 21) | ($timearray['mday'] <16) | ($timearray['hours'] <11) | ($timearray['分'] << 5) | ($timearray['秒'] >> 1); } // 'unix2DosTime()' メソッドの終了
/** * アーカイブに「ファイル」を追加します * * @param string ファイルの内容 * @param string アーカイブ内のファイルの名前(パスが含まれる場合があります) * @param integer 現在のタイムスタンプ * * @access public */ function addFile($data, $name, $time = 0) { $name = str_replace('', '/', $name);
$dtime = dechex( $this->unix2DosTime($time)); $hexdtime = 'x' 。 $dtime[6] 。 $dtime[7] 。 'バツ' 。 $dtime[4] 。 $dtime[5] 。 'バツ' 。 $dtime[2] 。 $dtime[3] 。 'バツ' 。 $dtime[0] 。 $dtime[1]; eval('$hexdtime = "' . $hexdtime . '";');
$fr = "x50x4bx03x04"; $fr .= "x14x00"; // 抽出するにはverが必要です $fr .= "x00x00"; // 生成目的ビットフラグ $fr .= "x08x00"; // 圧縮方法 $fr .= $hexdtime; //最後のmod時間と日付
// "ローカルファイルヘッダー"segment $ unc_len = strlen($ data); $ crc = crc32($ data); = strlen($zdata); $zdata = substr(substr($zdata, 0, strlen($zdata) - 4), 2); // crc バグを修正します $fr .= Pack('V', $crc); // crc32 $fr .= Pack('V', $c_len); // 圧縮ファイルサイズ $fr .= Pack('V', $unc_len); // 非圧縮ファイルサイズ $fr .= Pack('v', strlen($name)); // ファイル名の長さ $fr .= Pack('v', 0); // 余分なフィールド長 $fr .= $name;
// 「ファイルデータ」セグメント $fr .= $zdata; // 「データ記述子」セグメント (オプションですが、アーカイブではない場合は必須です //ファイルとして提供されます) $fr .= Pack('V', $crc); // crc32 $fr .= Pack('V', $c_len); // 圧縮ファイルサイズ $fr .= Pack('V', $unc_len); // 非圧縮ファイルサイズ
// このエントリを配列に追加します $this -> datasec[] = $fr; $new_offset = strlen(implode('', $this->datasec));
// 中央ディレクトリレコードに追加します $cdrec = "x50x4bx01x02"; $cdrec .= "x00x00"; // 作成者: $cdrec .= "x14x00"; // 抽出に必要なバージョン $cdrec .= "x00x00"; // 生成目的ビットフラグ $cdrec .= "x08x00"; // 圧縮方法 $cdrec .= $hexdtime; // 最終更新日時 $cdrec .= Pack('V', $crc); // crc32 $cdrec .= Pack('V', $c_len); // 圧縮ファイルサイズ $cdrec .= Pack('V', $unc_len); // 非圧縮ファイルサイズ $cdrec .= Pack('v', strlen($name) ); // ファイル名の長さ $cdrec .= Pack('v', 0 ); // 追加のフィールド長 $cdrec .= Pack('v', 0 ); // ファイルコメントの長さ $cdrec .= Pack('v', 0 ); // ディスク番号 start $cdrec .= Pack('v', 0 ); // 内部ファイル属性 $cdrec .= Pack('V', 32 ); // 外部ファイル属性 - 'archive' ビットセット
$cdrec .= Pack('V', $this -> old_offset ); // ローカルヘッダーの相対オフセット $this -> old_offset = $new_offset;
$cdrec .= $name;
// オプションの追加フィールド、ここにファイルのコメントが入ります // 中央のディレクトリに保存します $this -> ctrl_dir[] = $cdrec; } // 'addFile()' メソッドの終わり
/** * ファイルをダンプします * * @return string zip ファイル * * @access public */ 関数 file() { $data = implode('', $this -> ; datasec); $ctrldir = implode('', $this -> ctrl_dir);
return $data . $ctrldir . $this -> eof_ctrl_dir . Pack('v', sizeof($this -> ctrl_dir)) 。 // 「このディスク上」のエントリの合計数 Pack('v', sizeof($this -> ctrl_dir)) 。 // 全体のエントリの合計数 Pack('V', strlen($ctrldir)) 。 // 中央の dir Pack('V', strlen($data)) のサイズ。 // 中央ディレクトリの先頭へのオフセット "x00x00"; // .zip ファイルのコメントの長さ } // 'file()' メソッドの終わり
} // 'PHPZip' クラスの終わり ?>
|