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

📄 tar.php

📁 不错的东西
💻 PHP
📖 第 1 页 / 共 5 页
字号:


            $this->_file = 0;

        }



        // ----- Look if a local copy need to be erase

        // Note that it might be interesting to keep the url for a time : ToDo

        if ($this->_temp_tarname != '') {

            @unlink($this->_temp_tarname);

            $this->_temp_tarname = '';

        }



        return true;

    }

    // }}}



    // {{{ _cleanFile()

    function _cleanFile()

    {

        $this->_close();



        // ----- Look for a local copy

        if ($this->_temp_tarname != '') {

            // ----- Remove the local copy but not the remote tarname

            @unlink($this->_temp_tarname);

            $this->_temp_tarname = '';

        } else {

            // ----- Remove the local tarname file

            @unlink($this->_tarname);

        }

        $this->_tarname = '';



        return true;

    }

    // }}}



    // {{{ _writeBlock()

    function _writeBlock($p_binary_data, $p_len=null)

    {

      if (is_resource($this->_file)) {

          if ($p_len === null) {

              if ($this->_compress_type == 'gz')

                  @gzputs($this->_file, $p_binary_data);

              else if ($this->_compress_type == 'bz2')

                  @bzwrite($this->_file, $p_binary_data);

              else if ($this->_compress_type == 'none')

                  @fputs($this->_file, $p_binary_data);

              else

                  $this->_error('Unknown or missing compression type ('

				                .$this->_compress_type.')');

          } else {

              if ($this->_compress_type == 'gz')

                  @gzputs($this->_file, $p_binary_data, $p_len);

              else if ($this->_compress_type == 'bz2')

                  @bzwrite($this->_file, $p_binary_data, $p_len);

              else if ($this->_compress_type == 'none')

                  @fputs($this->_file, $p_binary_data, $p_len);

              else

                  $this->_error('Unknown or missing compression type ('

				                .$this->_compress_type.')');



          }

      }

      return true;

    }

    // }}}



    // {{{ _readBlock()

    function _readBlock()

    {

      $v_block = null;

      if (is_resource($this->_file)) {

          if ($this->_compress_type == 'gz')

              $v_block = @gzread($this->_file, 512);

          else if ($this->_compress_type == 'bz2')

              $v_block = @bzread($this->_file, 512);

          else if ($this->_compress_type == 'none')

              $v_block = @fread($this->_file, 512);

          else

              $this->_error('Unknown or missing compression type ('

			                .$this->_compress_type.')');

      }

      return $v_block;

    }

    // }}}



    // {{{ _jumpBlock()

    function _jumpBlock($p_len=null)

    {

      if (is_resource($this->_file)) {

          if ($p_len === null)

              $p_len = 1;



          if ($this->_compress_type == 'gz') {

              @gzseek($this->_file, @gztell($this->_file)+($p_len*512));

          }

          else if ($this->_compress_type == 'bz2') {

              // ----- Replace missing bztell() and bzseek()

              for ($i=0; $i<$p_len; $i++)

                  $this->_readBlock();

          } else if ($this->_compress_type == 'none')

              @fseek($this->_file, @ftell($this->_file)+($p_len*512));

          else

              $this->_error('Unknown or missing compression type ('

			                .$this->_compress_type.')');



      }

      return true;

    }

    // }}}



    // {{{ _writeFooter()

    function _writeFooter()

    {

      if (is_resource($this->_file)) {

          // ----- Write the last 0 filled block for end of archive

          $v_binary_data = pack("a512", '');

          $this->_writeBlock($v_binary_data);

      }

      return true;

    }

    // }}}



    // {{{ _addList()

    function _addList($p_list, $p_add_dir, $p_remove_dir)

    {

      $v_result=true;

      $v_header = array();



      // ----- Remove potential windows directory separator

      $p_add_dir = $this->_translateWinPath($p_add_dir);

      $p_remove_dir = $this->_translateWinPath($p_remove_dir, false);



      if (!$this->_file) {

          $this->_error('Invalid file descriptor');

          return false;

      }



      if (sizeof($p_list) == 0)

          return true;



      foreach ($p_list as $v_filename) {

          if (!$v_result) {

              break;

          }



        // ----- Skip the current tar name

        if ($v_filename == $this->_tarname)

            continue;



        if ($v_filename == '')

            continue;



        if (!file_exists($v_filename)) {

            $this->_warning("File '$v_filename' does not exist");

            continue;

        }



        // ----- Add the file or directory header

        if (!$this->_addFile($v_filename, $v_header, $p_add_dir, $p_remove_dir))

            return false;



        if (@is_dir($v_filename)) {

            if (!($p_hdir = opendir($v_filename))) {

                $this->_warning("Directory '$v_filename' can not be read");

                continue;

            }

            while (false !== ($p_hitem = readdir($p_hdir))) {

                if (($p_hitem != '.') && ($p_hitem != '..')) {

                    if ($v_filename != ".")

                        $p_temp_list[0] = $v_filename.'/'.$p_hitem;

                    else

                        $p_temp_list[0] = $p_hitem;



                    $v_result = $this->_addList($p_temp_list,

					                            $p_add_dir,

												$p_remove_dir);

                }

            }



            unset($p_temp_list);

            unset($p_hdir);

            unset($p_hitem);

        }

      }



      return $v_result;

    }

    // }}}



    // {{{ _addFile()

    function _addFile($p_filename, &$p_header, $p_add_dir, $p_remove_dir)

    {

      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);;

      $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 ($this->_isArchive($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);

⌨️ 快捷键说明

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