static function compress($target_file, $root_dir, $properties = array()) { $tmp_file = File::newTempFile(); $writer = $tmp_file->openWriter(); $binarydata = pack("a3", self::FF_ARCHIVE_HEADER); $writer->write($binarydata); $binarydata = pack("v3", self::CURRENT_MAJOR, self::CURRENT_MINOR, self::CURRENT_REV); $writer->write($binarydata); //properties if (count($properties) == 0) { $properties_as_string = ""; } else { $properties_as_string = PropertiesUtils::saveToString($properties, false); } $binarydata = pack("v", strlen($properties_as_string)); $writer->write($binarydata); $binarydata = pack("a*", $properties_as_string); $writer->write($binarydata); //end properties $metadata_pos = $writer->pos(); //num_entries $binarydata = pack("v", 0); $writer->write($binarydata); $total_entries = self::__recursive_compress_dir($writer, $root_dir, $root_dir); $writer->seek($metadata_pos); $binarydata = pack("v", $total_entries); $writer->write($binarydata); $writer->close(); $final_dir = $target_file->getDirectory(); $final_dir->touch(); $final_name = $target_file->getFilename(); $tmp_file->move_to($final_dir, $final_name); }