예제 #1
0
 public static function createDirEntry($path, $timestamp)
 {
     $fileEntry = new ZipFileEntry();
     $fileEntry->gzType = 0;
     $fileEntry->gpFlags = 0;
     $fileEntry->fileCRC32 = 0;
     $fileEntry->externalFileAttributes = ZipFileEntry::EXT_FILE_ATTR_DIR;
     $fileEntry->gzLength = 0;
     $fileEntry->dataLength = 0;
     $fileEntry->isDirectory = true;
     $fileEntry->dosTime = ZipUtils::getDosTime($timestamp);
     $fileEntry->path = $path;
     $ef = new ExtendedTimeStampExtraField();
     $ef->setModTime($timestamp);
     $ef->setAccessTime($timestamp);
     $fileEntry->addExtraField($ef);
     $ef = new GenericExtraField();
     $ef->header = AbstractExtraField::HEADER_UNIX_TYPE_3;
     $ef->setFieldData("è", '');
     $fileEntry->addExtraField($ef);
     return $fileEntry;
 }
예제 #2
0
 private function processStream($handle, $subPath = '')
 {
     $pkHeader = null;
     do {
         $curPos = ftell($handle);
         $pkHeader = AbstractZipHeader::seekPKHeader($handle);
         if ($pkHeader === false || feof($handle)) {
             break;
         }
         $pkPos = ftell($handle);
         if ($curPos < $pkPos) {
             $this->_throwException(new HeaderPositionError(array('expected' => $curPos, 'actual' => $pkPos)));
         }
         if ($pkHeader === AbstractZipHeader::ZIP_CENTRAL_FILE_HEADER) {
             $fileEntry = $this->FILES[$this->CDRindex++];
             /* @var $fileEntry ZipFileEntry */
             $fileEntry->parseHeader($handle);
         } else {
             if ($pkHeader === AbstractZipHeader::ZIP_LOCAL_FILE_HEADER) {
                 $fileEntry = new ZipFileEntry($handle);
                 $this->FILES[$this->LFHindex++] = $fileEntry;
                 $fileEntry->prependPath($subPath);
                 $lf = $fileEntry->getLocalHeader();
                 $lfLen = ZipUtils::bin_strlen($lf);
                 $this->zipWrite($lf);
                 fseek($handle, $fileEntry->offset + $fileEntry->dataOffset, SEEK_SET);
                 if (!$fileEntry->isDirectory) {
                     $len = $fileEntry->gzLength;
                     while ($len >= $this->streamChunkSize) {
                         $data = fread($handle, $this->streamChunkSize);
                         $this->zipWrite($data);
                         $len -= $this->streamChunkSize;
                     }
                     $data = fread($handle, $len);
                     $this->zipWrite($data);
                 }
                 $fileEntry->offset = $this->entryOffset;
                 $this->entryOffset += $lfLen + $fileEntry->gzLength;
             } else {
                 if ($pkHeader === AbstractZipHeader::ZIP_END_OF_CENTRAL_DIRECTORY) {
                     fread($handle, 4);
                     $this->eocd = new EndOfCentralDirectory($handle);
                 }
             }
         }
     } while (!feof($handle));
 }