⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tar.php

📁 php-4.4.7学习linux时下载的源代码
💻 PHP
📖 第 1 页 / 共 4 页
字号:
      // ----- Calculate the stored filename      $p_filename = $this->_translateWinPath($p_filename, false);;      $v_stored_filename = $p_filename;      if (strcmp($p_filename, $p_remove_dir) == 0) {          return true;      }      if ($p_remove_dir != '') {          if (substr($p_remove_dir, -1) != '/')              $p_remove_dir .= '/';          if (substr($p_filename, 0, strlen($p_remove_dir)) == $p_remove_dir)              $v_stored_filename = substr($p_filename, strlen($p_remove_dir));      }      $v_stored_filename = $this->_translateWinPath($v_stored_filename);      if ($p_add_dir != '') {          if (substr($p_add_dir, -1) == '/')              $v_stored_filename = $p_add_dir.$v_stored_filename;          else              $v_stored_filename = $p_add_dir.'/'.$v_stored_filename;      }      $v_stored_filename = $this->_pathReduction($v_stored_filename);      if (is_file($p_filename)) {          if (($v_file = @fopen($p_filename, "rb")) == 0) {              $this->_warning("Unable to open file '$p_filename' in binary read mode");              return true;          }          if (!$this->_writeHeader($p_filename, $v_stored_filename))              return false;          while (($v_buffer = fread($v_file, 512)) != '') {              $v_binary_data = pack("a512", "$v_buffer");              $this->_writeBlock($v_binary_data);          }          fclose($v_file);      } else {          // ----- Only header for dir          if (!$this->_writeHeader($p_filename, $v_stored_filename))              return false;      }      return true;    }    // }}}    // {{{ _addString()    function _addString($p_filename, $p_string)    {      if (!$this->_file) {          $this->_error('Invalid file descriptor');          return false;      }      if ($p_filename == '') {          $this->_error('Invalid file name');          return false;      }      // ----- Calculate the stored filename      $p_filename = $this->_translateWinPath($p_filename, false);;      if (!$this->_writeHeaderBlock($p_filename, strlen($p_string), 0, 0, "", 0, 0))          return false;      $i=0;      while (($v_buffer = substr($p_string, (($i++)*512), 512)) != '') {          $v_binary_data = pack("a512", $v_buffer);          $this->_writeBlock($v_binary_data);      }      return true;    }    // }}}    // {{{ _writeHeader()    function _writeHeader($p_filename, $p_stored_filename)    {        if ($p_stored_filename == '')            $p_stored_filename = $p_filename;        $v_reduce_filename = $this->_pathReduction($p_stored_filename);        if (strlen($v_reduce_filename) > 99) {          if (!$this->_writeLongHeader($v_reduce_filename))            return false;        }        $v_info = stat($p_filename);        $v_uid = sprintf("%6s ", DecOct($v_info[4]));        $v_gid = sprintf("%6s ", DecOct($v_info[5]));        $v_perms = sprintf("%6s ", DecOct(fileperms($p_filename)));        $v_mtime = sprintf("%11s", DecOct(filemtime($p_filename)));        if (@is_dir($p_filename)) {          $v_typeflag = "5";          $v_size = sprintf("%11s ", DecOct(0));        } else {          $v_typeflag = '';          clearstatcache();          $v_size = sprintf("%11s ", DecOct(filesize($p_filename)));        }        $v_linkname = '';        $v_magic = '';        $v_version = '';        $v_uname = '';        $v_gname = '';        $v_devmajor = '';        $v_devminor = '';        $v_prefix = '';        $v_binary_data_first = pack("a100a8a8a8a12A12", $v_reduce_filename, $v_perms, $v_uid, $v_gid, $v_size, $v_mtime);        $v_binary_data_last = pack("a1a100a6a2a32a32a8a8a155a12", $v_typeflag, $v_linkname, $v_magic, $v_version, $v_uname, $v_gname, $v_devmajor, $v_devminor, $v_prefix, '');        // ----- Calculate the checksum        $v_checksum = 0;        // ..... First part of the header        for ($i=0; $i<148; $i++)            $v_checksum += ord(substr($v_binary_data_first,$i,1));        // ..... Ignore the checksum value and replace it by ' ' (space)        for ($i=148; $i<156; $i++)            $v_checksum += ord(' ');        // ..... Last part of the header        for ($i=156, $j=0; $i<512; $i++, $j++)            $v_checksum += ord(substr($v_binary_data_last,$j,1));        // ----- Write the first 148 bytes of the header in the archive        $this->_writeBlock($v_binary_data_first, 148);        // ----- Write the calculated checksum        $v_checksum = sprintf("%6s ", DecOct($v_checksum));        $v_binary_data = pack("a8", $v_checksum);        $this->_writeBlock($v_binary_data, 8);        // ----- Write the last 356 bytes of the header in the archive        $this->_writeBlock($v_binary_data_last, 356);        return true;    }    // }}}    // {{{ _writeHeaderBlock()    function _writeHeaderBlock($p_filename, $p_size, $p_mtime=0, $p_perms=0, $p_type='', $p_uid=0, $p_gid=0)    {        $p_filename = $this->_pathReduction($p_filename);        if (strlen($p_filename) > 99) {          if (!$this->_writeLongHeader($p_filename))            return false;        }        if ($p_type == "5") {          $v_size = sprintf("%11s ", DecOct(0));        } else {          $v_size = sprintf("%11s ", DecOct($p_size));        }        $v_uid = sprintf("%6s ", DecOct($p_uid));        $v_gid = sprintf("%6s ", DecOct($p_gid));        $v_perms = sprintf("%6s ", DecOct($p_perms));        $v_mtime = sprintf("%11s", DecOct($p_mtime));        $v_linkname = '';        $v_magic = '';        $v_version = '';        $v_uname = '';        $v_gname = '';        $v_devmajor = '';        $v_devminor = '';        $v_prefix = '';        $v_binary_data_first = pack("a100a8a8a8a12A12", $p_filename, $v_perms, $v_uid, $v_gid, $v_size, $v_mtime);        $v_binary_data_last = pack("a1a100a6a2a32a32a8a8a155a12", $p_type, $v_linkname, $v_magic, $v_version, $v_uname, $v_gname, $v_devmajor, $v_devminor, $v_prefix, '');        // ----- Calculate the checksum        $v_checksum = 0;        // ..... First part of the header        for ($i=0; $i<148; $i++)            $v_checksum += ord(substr($v_binary_data_first,$i,1));        // ..... Ignore the checksum value and replace it by ' ' (space)        for ($i=148; $i<156; $i++)            $v_checksum += ord(' ');        // ..... Last part of the header        for ($i=156, $j=0; $i<512; $i++, $j++)            $v_checksum += ord(substr($v_binary_data_last,$j,1));        // ----- Write the first 148 bytes of the header in the archive        $this->_writeBlock($v_binary_data_first, 148);        // ----- Write the calculated checksum        $v_checksum = sprintf("%6s ", DecOct($v_checksum));        $v_binary_data = pack("a8", $v_checksum);        $this->_writeBlock($v_binary_data, 8);        // ----- Write the last 356 bytes of the header in the archive        $this->_writeBlock($v_binary_data_last, 356);        return true;    }    // }}}    // {{{ _writeLongHeader()    function _writeLongHeader($p_filename)    {        $v_size = sprintf("%11s ", DecOct(strlen($p_filename)));        $v_typeflag = 'L';        $v_linkname = '';        $v_magic = '';        $v_version = '';        $v_uname = '';        $v_gname = '';        $v_devmajor = '';        $v_devminor = '';        $v_prefix = '';        $v_binary_data_first = pack("a100a8a8a8a12A12", '././@LongLink', 0, 0, 0, $v_size, 0);        $v_binary_data_last = pack("a1a100a6a2a32a32a8a8a155a12", $v_typeflag, $v_linkname, $v_magic, $v_version, $v_uname, $v_gname, $v_devmajor, $v_devminor, $v_prefix, '');        // ----- Calculate the checksum        $v_checksum = 0;        // ..... First part of the header        for ($i=0; $i<148; $i++)            $v_checksum += ord(substr($v_binary_data_first,$i,1));        // ..... Ignore the checksum value and replace it by ' ' (space)        for ($i=148; $i<156; $i++)            $v_checksum += ord(' ');        // ..... Last part of the header        for ($i=156, $j=0; $i<512; $i++, $j++)            $v_checksum += ord(substr($v_binary_data_last,$j,1));        // ----- Write the first 148 bytes of the header in the archive        $this->_writeBlock($v_binary_data_first, 148);        // ----- Write the calculated checksum        $v_checksum = sprintf("%6s ", DecOct($v_checksum));        $v_binary_data = pack("a8", $v_checksum);        $this->_writeBlock($v_binary_data, 8);        // ----- Write the last 356 bytes of the header in the archive        $this->_writeBlock($v_binary_data_last, 356);        // ----- Write the filename as content of the block        $i=0;        while (($v_buffer = substr($p_filename, (($i++)*512), 512)) != '') {            $v_binary_data = pack("a512", "$v_buffer");            $this->_writeBlock($v_binary_data);        }        return true;    }    // }}}    // {{{ _readHeader()    function _readHeader($v_binary_data, &$v_header)    {        if (strlen($v_binary_data)==0) {            $v_header['filename'] = '';            return true;        }        if (strlen($v_binary_data) != 512) {            $v_header['filename'] = '';            $this->_error('Invalid block size : '.strlen($v_binary_data));            return false;        }        // ----- Calculate the checksum        $v_checksum = 0;        // ..... First part of the header        for ($i=0; $i<148; $i++)            $v_checksum+=ord(substr($v_binary_data,$i,1));        // ..... Ignore the checksum value and replace it by ' ' (space)        for ($i=148; $i<156; $i++)            $v_checksum += ord(' ');        // ..... Last part of the header        for ($i=156; $i<512; $i++)           $v_checksum+=ord(substr($v_binary_data,$i,1));        $v_data = unpack("a100filename/a8mode/a8uid/a8gid/a12size/a12mtime/a8checksum/a1typeflag/a100link/a6magic/a2version/a32uname/a32gname/a8devmajor/a8devminor", $v_binary_data);        // ----- Extract the checksum        $v_header['checksum'] = OctDec(trim($v_data['checksum']));        if ($v_header['checksum'] != $v_checksum) {            $v_header['filename'] = '';            // ----- Look for last block (empty block)            if (($v_checksum == 256) && ($v_header['checksum'] == 0))                return true;            $this->_error('Invalid checksum for file "'.$v_data['filename'].'" : '.$v_checksum.' calculated, '.$v_header['checksum'].' expected');            return false;        }        // ----- Extract the properties        $v_header['filename'] = trim($v_data['filename']);        $v_header['mode'] = OctDec(trim($v_data['mode']));        $v_header['uid'] = OctDec(trim($v_data['uid']));        $v_header['gid'] = OctDec(trim($v_data['gid']));        $v_header['size'] = OctDec(trim($v_data['size']));        $v_header['mtime'] = OctDec(trim($v_data['mtime']));        if (($v_header['typeflag'] = $v_data['typeflag']) == "5") {          $v_header['size'] = 0;        }        /* ----- All these fields are removed form the header because they do not carry interesting info        $v_header[link] = trim($v_data[link]);        $v_header[magic] = trim($v_data[magic]);        $v_header[version] = trim($v_data[version]);        $v_header[uname] = trim($v_data[uname]);        $v_header[gname] = trim($v_data[gname]);        $v_header[devmajor] = trim($v_data[devmajor]);        $v_header[devminor] = trim($v_data[devminor]);        */        return true;    }    // }}}    // {{{ _readLongHeader()    function _readLongHeader(&$v_header)    {      $v_filename = '';      $n = floor($v_header['size']/512);      for ($i=0; $i<$n; $i++) {        $v_content = $this->_readBlock();        $v_filename .= $v_content;      }      if (($v_header['size'] % 512) != 0) {        $v_content = $this->_readBlock();        $v_filename .= $v_content;      }      // ----- Read the next header      $v_binary_data = $this->_readBlock();      if (!$this->_readHeader($v_binary_data, $v_header))        return false;      $v_header['filename'] = $v_filename;      return true;    }    // }}}    // {{{ _extractInString()    /**    * This method extract from the archive one file identified by $p_filename.    * The return value is a string with the file content, or NULL on error.    * @param string $p_filename     The path of the file to extract in a string.    * @return                       a string with the file content or NULL.    * @access private    */    function _extractInString($p_filename)    {        $v_result_str = "";        While (strlen($v_binary_data = $this->_readBlock()) != 0)        {          if (!$this->_readHeader($v_binary_data, $v_header))            return NULL;          if ($v_header['filename'] == '')            continue;          // ----- Look for long filename          if ($v_header['typeflag'] == 'L') {            if (!$this->_readLongHeader($v_header))              return NULL;          }          if ($v_header['filename'] == $p_filename) {              if ($v_header['typeflag'] == "5") {                  $this->_error('Unable to extract in string a directory entry {'.$v_header['filename'].'}');                  return NULL;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -