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

📄 tar.php

📁 apache windows下的一款好
💻 PHP
📖 第 1 页 / 共 3 页
字号:
        }

        if ($v_result = $this->_openRead()) {
            $v_result = $this->_extractList($p_path, $v_list_detail, "complete", $v_list, $p_remove_path);
            $this->_close();
        }

        return $v_result;
    }
    // }}}

    // {{{ _error()
    function _error($p_message)
    {
        // ----- To be completed
        $this->raiseError($p_message);
    }
    // }}}

    // {{{ _warning()
    function _warning($p_message)
    {
        // ----- To be completed
        $this->raiseError($p_message);
    }
    // }}}

    // {{{ _openWrite()
    function _openWrite()
    {
        if ($this->_compress)
            $this->_file = @gzopen($this->_tarname, "w");
        else
            $this->_file = @fopen($this->_tarname, "w");

        if ($this->_file == 0) {
            $this->_error("Unable to open in write mode '".$this->_tarname."'");
            return false;
        }

        return true;
    }
    // }}}

    // {{{ _openRead()
    function _openRead()
    {
        if ($this->_compress)
            $this->_file = @gzopen($this->_tarname, "rb");
        else
            $this->_file = @fopen($this->_tarname, "rb");

        if ($this->_file == 0) {
            $this->_error("Unable to open in read mode '".$this->_tarname."'");
            return false;
        }

        return true;
    }
    // }}}

    // {{{ _openReadWrite()
    function _openReadWrite()
    {
        if ($this->_compress)
            $this->_file = @gzopen($this->_tarname, "r+b");
        else
            $this->_file = @fopen($this->_tarname, "r+b");

        if ($this->_file == 0) {
            $this->_error("Unable to open in read/write mode '".$this->_tarname."'");
            return false;
        }

        return true;
    }
    // }}}

    // {{{ _close()
    function _close()
    {
        if ($this->_file) {
            if ($this->_compress)
                @gzclose($this->_file);
            else
                @fclose($this->_file);

            $this->_file = 0;
        }

        return true;
    }
    // }}}

    // {{{ _cleanFile()
    function _cleanFile()
    {
        _close();
        @unlink($this->tarname);

        return true;
    }
    // }}}

    // {{{ _writeFooter()
    function _writeFooter()
    {
      if ($this->_file) {
          // ----- Write the last 0 filled block for end of archive
          $v_binary_data = pack("a512", "");
          if ($this->_compress)
            @gzputs($this->_file, $v_binary_data);
          else
            @fputs($this->_file, $v_binary_data);
      }
      return true;
    }
    // }}}

    // {{{ _addList()
    function _addList($p_list, $p_add_dir, $p_remove_dir)
    {
      $v_result=true;
      $v_header = array();

      if (!$this->_file) {
          $this->_error("Invalid file descriptor");
          return false;
      }

      if (sizeof($p_list) == 0)
          return true;

      for ($j=0; ($j<count($p_list)) && ($v_result); $j++) {
        $v_filename = $p_list[$j];

        // ----- 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;
            }
            $p_hitem = readdir($p_hdir); // '.' directory
            $p_hitem = readdir($p_hdir); // '..' directory
            while ($p_hitem = readdir($p_hdir)) {
                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
      $v_stored_filename = $p_filename;
      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));
      }
      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;
      }

      if (strlen($v_stored_filename) > 99) {
          $this->_warning("Stored file name is too long (max. 99) : '$v_stored_filename'");
          fclose($v_file);
          return true;
      }

      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");
              if ($this->_compress)
                  @gzputs($this->_file, $v_binary_data);
              else
                  @fputs($this->_file, $v_binary_data);
          }

          fclose($v_file);

      } else {
          // ----- Only header for dir
          if (!$this->_writeHeader($p_filename, $v_stored_filename))
              return false;
      }

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

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

        clearstatcache();
        $v_size = sprintf("%11s ", DecOct(filesize($p_filename)));

        $v_mtime = sprintf("%11s", DecOct(filemtime($p_filename)));

        if (@is_dir($p_filename))
          $v_typeflag = "5";
        else
          $v_typeflag = "";

        $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
        if ($this->_compress)
            @gzputs($this->_file, $v_binary_data_first, 148);
        else
            @fputs($this->_file, $v_binary_data_first, 148);

        // ----- Write the calculated checksum
        $v_checksum = sprintf("%6s ", DecOct($v_checksum));
        $v_binary_data = pack("a8", $v_checksum);
        if ($this->_compress)
          @gzputs($this->_file, $v_binary_data, 8);
        else
          @fputs($this->_file, $v_binary_data, 8);

        // ----- Write the last 356 bytes of the header in the archive
        if ($this->_compress)
            @gzputs($this->_file, $v_binary_data_last, 356);
        else
            @fputs($this->_file, $v_binary_data_last, 356);

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

⌨️ 快捷键说明

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