omnizip 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.rspec +3 -0
- data/.rubocop.yml +32 -0
- data/.rubocop_todo.yml +754 -0
- data/COPYING +502 -0
- data/Gemfile +17 -0
- data/LICENSE +12 -0
- data/README.adoc +1045 -0
- data/Rakefile +12 -0
- data/benchmark/README.md +260 -0
- data/benchmark/benchmark_suite.rb +125 -0
- data/benchmark/compression_bench.rb +181 -0
- data/benchmark/filter_bench.rb +180 -0
- data/benchmark/models/benchmark_result.rb +59 -0
- data/benchmark/models/comparison_result.rb +69 -0
- data/benchmark/profile_suite.rb +167 -0
- data/benchmark/reporter.rb +150 -0
- data/benchmark/run_benchmarks.rb +66 -0
- data/benchmark/test_data.rb +137 -0
- data/config/formats/rar3_spec.yml +91 -0
- data/config/formats/rar5_spec.yml +102 -0
- data/docs/.github/workflows/docs.yml +142 -0
- data/docs/.gitignore +21 -0
- data/docs/.lychee.toml +67 -0
- data/docs/Gemfile +13 -0
- data/docs/RAR_WRITE_SUPPORT.md +26 -0
- data/docs/README.md +101 -0
- data/docs/_config.yml +112 -0
- data/docs/assets/logo.svg +1 -0
- data/docs/assets/omnizip-logo.pdf +1540 -11
- data/docs/comparison/feature-matrix.adoc +694 -0
- data/docs/comparison/index.adoc +113 -0
- data/docs/comparison/vs-7zip.adoc +309 -0
- data/docs/comparison/vs-peazip.adoc +77 -0
- data/docs/comparison/vs-rubyzip.adoc +342 -0
- data/docs/comparison/vs-winrar.adoc +100 -0
- data/docs/compatibility.adoc +579 -0
- data/docs/concepts/index.adoc +129 -0
- data/docs/developer/architecture.adoc +256 -0
- data/docs/developer/contributing.adoc +158 -0
- data/docs/developer/index.adoc +25 -0
- data/docs/developer/testing.adoc +212 -0
- data/docs/getting-started/basic-usage.adoc +271 -0
- data/docs/getting-started/index.adoc +42 -0
- data/docs/getting-started/installation.adoc +138 -0
- data/docs/getting-started/quick-start.adoc +185 -0
- data/docs/getting-started/your-first-archive.adoc +218 -0
- data/docs/guides/advanced-features/encryption.adoc +300 -0
- data/docs/guides/advanced-features/index.adoc +49 -0
- data/docs/guides/advanced-features/parallel-processing.adoc +246 -0
- data/docs/guides/advanced-features/progress-tracking.adoc +320 -0
- data/docs/guides/advanced-features/streaming.adoc +212 -0
- data/docs/guides/archive-formats/gzip-format.adoc +107 -0
- data/docs/guides/archive-formats/index.adoc +130 -0
- data/docs/guides/archive-formats/rar-format.adoc +104 -0
- data/docs/guides/archive-formats/rar5.adoc +521 -0
- data/docs/guides/archive-formats/seven-zip-format.adoc +35 -0
- data/docs/guides/archive-formats/tar-format.adoc +106 -0
- data/docs/guides/archive-formats/xz-format.adoc +118 -0
- data/docs/guides/archive-formats/zip-format.adoc +35 -0
- data/docs/guides/compression-algorithms/bzip2.adoc +113 -0
- data/docs/guides/compression-algorithms/deflate.adoc +319 -0
- data/docs/guides/compression-algorithms/index.adoc +190 -0
- data/docs/guides/compression-algorithms/lzma.adoc +398 -0
- data/docs/guides/compression-algorithms/lzma2.adoc +327 -0
- data/docs/guides/compression-algorithms/ppmd.adoc +316 -0
- data/docs/guides/compression-algorithms/zstandard.adoc +361 -0
- data/docs/guides/creating-archives.adoc +354 -0
- data/docs/guides/extracting-archives.adoc +53 -0
- data/docs/guides/format-conversion.adoc +64 -0
- data/docs/guides/index.adoc +49 -0
- data/docs/guides/migration-rubyzip.adoc +217 -0
- data/docs/guides/parity-archives.adoc +605 -0
- data/docs/guides/performance-tuning.adoc +88 -0
- data/docs/index.adoc +218 -0
- data/docs/lychee.toml +67 -0
- data/docs/reference/api/overview.adoc +188 -0
- data/docs/reference/cli/compress-command.adoc +114 -0
- data/docs/reference/cli/overview.adoc +140 -0
- data/docs/reference/index.adoc +26 -0
- data/docs/resources/faq.adoc +185 -0
- data/docs/resources/quick-reference.adoc +222 -0
- data/docs/troubleshooting/index.adoc +208 -0
- data/examples/api_comparison.rb +205 -0
- data/examples/deflate64_example.rb +96 -0
- data/examples/par2_demo.rb +121 -0
- data/examples/quick_start_native.rb +150 -0
- data/examples/quick_start_rubyzip.rb +115 -0
- data/examples/rubyzip_compatibility_demo.rb +194 -0
- data/exe/omnizip +27 -0
- data/lib/omnizip/algorithm.rb +130 -0
- data/lib/omnizip/algorithm_registry.rb +86 -0
- data/lib/omnizip/algorithms/.keep +0 -0
- data/lib/omnizip/algorithms/bzip2/bwt.rb +225 -0
- data/lib/omnizip/algorithms/bzip2/decoder.rb +193 -0
- data/lib/omnizip/algorithms/bzip2/encoder.rb +237 -0
- data/lib/omnizip/algorithms/bzip2/huffman.rb +206 -0
- data/lib/omnizip/algorithms/bzip2/mtf.rb +101 -0
- data/lib/omnizip/algorithms/bzip2/rle.rb +151 -0
- data/lib/omnizip/algorithms/bzip2.rb +130 -0
- data/lib/omnizip/algorithms/deflate/constants.rb +28 -0
- data/lib/omnizip/algorithms/deflate/decoder.rb +38 -0
- data/lib/omnizip/algorithms/deflate/encoder.rb +46 -0
- data/lib/omnizip/algorithms/deflate.rb +128 -0
- data/lib/omnizip/algorithms/deflate64/constants.rb +45 -0
- data/lib/omnizip/algorithms/deflate64/decoder.rb +153 -0
- data/lib/omnizip/algorithms/deflate64/encoder.rb +98 -0
- data/lib/omnizip/algorithms/deflate64/huffman_coder.rb +354 -0
- data/lib/omnizip/algorithms/deflate64/lz77_encoder.rb +142 -0
- data/lib/omnizip/algorithms/deflate64.rb +109 -0
- data/lib/omnizip/algorithms/lzma/bit_model.rb +120 -0
- data/lib/omnizip/algorithms/lzma/constants.rb +112 -0
- data/lib/omnizip/algorithms/lzma/decoder.rb +148 -0
- data/lib/omnizip/algorithms/lzma/dictionary.rb +69 -0
- data/lib/omnizip/algorithms/lzma/distance_coder.rb +415 -0
- data/lib/omnizip/algorithms/lzma/encoder.rb +142 -0
- data/lib/omnizip/algorithms/lzma/length_coder.rb +260 -0
- data/lib/omnizip/algorithms/lzma/literal_decoder.rb +320 -0
- data/lib/omnizip/algorithms/lzma/literal_encoder.rb +210 -0
- data/lib/omnizip/algorithms/lzma/lzip_decoder.rb +341 -0
- data/lib/omnizip/algorithms/lzma/lzma_alone_decoder.rb +192 -0
- data/lib/omnizip/algorithms/lzma/lzma_state.rb +128 -0
- data/lib/omnizip/algorithms/lzma/match.rb +32 -0
- data/lib/omnizip/algorithms/lzma/match_finder.rb +205 -0
- data/lib/omnizip/algorithms/lzma/match_finder_config.rb +142 -0
- data/lib/omnizip/algorithms/lzma/match_finder_factory.rb +88 -0
- data/lib/omnizip/algorithms/lzma/optimal_encoder.rb +130 -0
- data/lib/omnizip/algorithms/lzma/probability_models.rb +72 -0
- data/lib/omnizip/algorithms/lzma/range_coder.rb +85 -0
- data/lib/omnizip/algorithms/lzma/range_decoder.rb +434 -0
- data/lib/omnizip/algorithms/lzma/range_encoder.rb +194 -0
- data/lib/omnizip/algorithms/lzma/state.rb +127 -0
- data/lib/omnizip/algorithms/lzma/xz_buffered_range_encoder.rb +325 -0
- data/lib/omnizip/algorithms/lzma/xz_encoder.rb +426 -0
- data/lib/omnizip/algorithms/lzma/xz_encoder_fast.rb +645 -0
- data/lib/omnizip/algorithms/lzma/xz_match_finder_adapter.rb +227 -0
- data/lib/omnizip/algorithms/lzma/xz_price_calculator.rb +169 -0
- data/lib/omnizip/algorithms/lzma/xz_probability_models.rb +261 -0
- data/lib/omnizip/algorithms/lzma/xz_range_encoder.rb +223 -0
- data/lib/omnizip/algorithms/lzma/xz_range_encoder_exact.rb +331 -0
- data/lib/omnizip/algorithms/lzma/xz_state.rb +116 -0
- data/lib/omnizip/algorithms/lzma/xz_utils_decoder.rb +2055 -0
- data/lib/omnizip/algorithms/lzma.rb +238 -0
- data/lib/omnizip/algorithms/lzma2/chunk_manager.rb +182 -0
- data/lib/omnizip/algorithms/lzma2/constants.rb +41 -0
- data/lib/omnizip/algorithms/lzma2/encoder.rb +147 -0
- data/lib/omnizip/algorithms/lzma2/lzma2_chunk.rb +161 -0
- data/lib/omnizip/algorithms/lzma2/properties.rb +179 -0
- data/lib/omnizip/algorithms/lzma2/simple_lzma2_encoder.rb +127 -0
- data/lib/omnizip/algorithms/lzma2/xz_encoder_adapter.rb +85 -0
- data/lib/omnizip/algorithms/lzma2.rb +141 -0
- data/lib/omnizip/algorithms/ppmd7/constants.rb +74 -0
- data/lib/omnizip/algorithms/ppmd7/context.rb +154 -0
- data/lib/omnizip/algorithms/ppmd7/decoder.rb +126 -0
- data/lib/omnizip/algorithms/ppmd7/encoder.rb +163 -0
- data/lib/omnizip/algorithms/ppmd7/model.rb +248 -0
- data/lib/omnizip/algorithms/ppmd7/symbol_state.rb +57 -0
- data/lib/omnizip/algorithms/ppmd7.rb +116 -0
- data/lib/omnizip/algorithms/ppmd8/constants.rb +61 -0
- data/lib/omnizip/algorithms/ppmd8/context.rb +34 -0
- data/lib/omnizip/algorithms/ppmd8/decoder.rb +107 -0
- data/lib/omnizip/algorithms/ppmd8/encoder.rb +138 -0
- data/lib/omnizip/algorithms/ppmd8/model.rb +250 -0
- data/lib/omnizip/algorithms/ppmd8/restoration_method.rb +78 -0
- data/lib/omnizip/algorithms/ppmd8.rb +82 -0
- data/lib/omnizip/algorithms/ppmd_base.rb +138 -0
- data/lib/omnizip/algorithms/sevenzip_lzma2.rb +123 -0
- data/lib/omnizip/algorithms/xz_lzma2.rb +118 -0
- data/lib/omnizip/algorithms/zstandard/constants.rb +25 -0
- data/lib/omnizip/algorithms/zstandard/decoder.rb +46 -0
- data/lib/omnizip/algorithms/zstandard/encoder.rb +51 -0
- data/lib/omnizip/algorithms/zstandard.rb +138 -0
- data/lib/omnizip/buffer/memory_archive.rb +251 -0
- data/lib/omnizip/buffer/memory_extractor.rb +224 -0
- data/lib/omnizip/buffer.rb +176 -0
- data/lib/omnizip/checksum_registry.rb +114 -0
- data/lib/omnizip/checksums/crc32.rb +100 -0
- data/lib/omnizip/checksums/crc64.rb +101 -0
- data/lib/omnizip/checksums/crc_base.rb +158 -0
- data/lib/omnizip/checksums/verifier.rb +131 -0
- data/lib/omnizip/chunked/memory_manager.rb +194 -0
- data/lib/omnizip/chunked/reader.rb +78 -0
- data/lib/omnizip/chunked/writer.rb +120 -0
- data/lib/omnizip/chunked.rb +129 -0
- data/lib/omnizip/cli/output_formatter.rb +104 -0
- data/lib/omnizip/cli.rb +572 -0
- data/lib/omnizip/commands/.keep +0 -0
- data/lib/omnizip/commands/archive_create_command.rb +427 -0
- data/lib/omnizip/commands/archive_extract_command.rb +272 -0
- data/lib/omnizip/commands/archive_list_command.rb +218 -0
- data/lib/omnizip/commands/archive_repair_command.rb +131 -0
- data/lib/omnizip/commands/archive_verify_command.rb +117 -0
- data/lib/omnizip/commands/compress_command.rb +117 -0
- data/lib/omnizip/commands/decompress_command.rb +120 -0
- data/lib/omnizip/commands/list_command.rb +53 -0
- data/lib/omnizip/commands/metadata_command.rb +153 -0
- data/lib/omnizip/commands/parity_create_command.rb +122 -0
- data/lib/omnizip/commands/parity_repair_command.rb +122 -0
- data/lib/omnizip/commands/parity_verify_command.rb +124 -0
- data/lib/omnizip/commands/profile_list_command.rb +56 -0
- data/lib/omnizip/commands/profile_show_command.rb +44 -0
- data/lib/omnizip/convenience.rb +359 -0
- data/lib/omnizip/converter/conversion_registry.rb +49 -0
- data/lib/omnizip/converter/conversion_strategy.rb +121 -0
- data/lib/omnizip/converter/seven_zip_to_zip_strategy.rb +97 -0
- data/lib/omnizip/converter/zip_to_seven_zip_strategy.rb +112 -0
- data/lib/omnizip/converter.rb +105 -0
- data/lib/omnizip/crypto/aes256/cipher.rb +100 -0
- data/lib/omnizip/crypto/aes256/constants.rb +28 -0
- data/lib/omnizip/crypto/aes256/key_derivation.rb +101 -0
- data/lib/omnizip/crypto/aes256.rb +102 -0
- data/lib/omnizip/error.rb +106 -0
- data/lib/omnizip/eta/exponential_smoothing_estimator.rb +98 -0
- data/lib/omnizip/eta/moving_average_estimator.rb +99 -0
- data/lib/omnizip/eta/rate_calculator.rb +104 -0
- data/lib/omnizip/eta/sample_history.rb +143 -0
- data/lib/omnizip/eta/time_estimator.rb +106 -0
- data/lib/omnizip/eta.rb +63 -0
- data/lib/omnizip/extraction/filter_chain.rb +177 -0
- data/lib/omnizip/extraction/glob_pattern.rb +140 -0
- data/lib/omnizip/extraction/pattern_matcher.rb +70 -0
- data/lib/omnizip/extraction/predicate_pattern.rb +52 -0
- data/lib/omnizip/extraction/regex_pattern.rb +50 -0
- data/lib/omnizip/extraction/selective_extractor.rb +240 -0
- data/lib/omnizip/extraction.rb +111 -0
- data/lib/omnizip/file_type/mime_classifier.rb +144 -0
- data/lib/omnizip/file_type.rb +113 -0
- data/lib/omnizip/filter.rb +139 -0
- data/lib/omnizip/filter_pipeline.rb +108 -0
- data/lib/omnizip/filter_registry.rb +166 -0
- data/lib/omnizip/filters/bcj.rb +279 -0
- data/lib/omnizip/filters/bcj2/constants.rb +53 -0
- data/lib/omnizip/filters/bcj2/decoder.rb +200 -0
- data/lib/omnizip/filters/bcj2/encoder.rb +61 -0
- data/lib/omnizip/filters/bcj2/stream_data.rb +93 -0
- data/lib/omnizip/filters/bcj2.rb +99 -0
- data/lib/omnizip/filters/bcj_arm.rb +176 -0
- data/lib/omnizip/filters/bcj_arm64.rb +244 -0
- data/lib/omnizip/filters/bcj_ia64.rb +196 -0
- data/lib/omnizip/filters/bcj_ppc.rb +190 -0
- data/lib/omnizip/filters/bcj_sparc.rb +176 -0
- data/lib/omnizip/filters/bcj_x86.rb +193 -0
- data/lib/omnizip/filters/delta.rb +196 -0
- data/lib/omnizip/filters/filter_base.rb +72 -0
- data/lib/omnizip/filters/registry.rb +123 -0
- data/lib/omnizip/filters/xz_delta.rb +258 -0
- data/lib/omnizip/format_detector.rb +162 -0
- data/lib/omnizip/format_registry.rb +59 -0
- data/lib/omnizip/formats/.keep +0 -0
- data/lib/omnizip/formats/bzip2_file.rb +172 -0
- data/lib/omnizip/formats/cpio/constants.rb +55 -0
- data/lib/omnizip/formats/cpio/entry.rb +385 -0
- data/lib/omnizip/formats/cpio/reader.rb +196 -0
- data/lib/omnizip/formats/cpio/writer.rb +234 -0
- data/lib/omnizip/formats/cpio.rb +140 -0
- data/lib/omnizip/formats/format_spec_loader.rb +230 -0
- data/lib/omnizip/formats/gzip.rb +238 -0
- data/lib/omnizip/formats/iso/directory_builder.rb +297 -0
- data/lib/omnizip/formats/iso/directory_record.rb +152 -0
- data/lib/omnizip/formats/iso/joliet.rb +204 -0
- data/lib/omnizip/formats/iso/path_table.rb +125 -0
- data/lib/omnizip/formats/iso/reader.rb +197 -0
- data/lib/omnizip/formats/iso/rock_ridge.rb +349 -0
- data/lib/omnizip/formats/iso/volume_builder.rb +320 -0
- data/lib/omnizip/formats/iso/volume_descriptor.rb +168 -0
- data/lib/omnizip/formats/iso/writer.rb +530 -0
- data/lib/omnizip/formats/iso.rb +140 -0
- data/lib/omnizip/formats/lzip.rb +175 -0
- data/lib/omnizip/formats/lzma_alone.rb +171 -0
- data/lib/omnizip/formats/rar/archive_repairer.rb +243 -0
- data/lib/omnizip/formats/rar/archive_verifier.rb +195 -0
- data/lib/omnizip/formats/rar/block_parser.rb +243 -0
- data/lib/omnizip/formats/rar/compression/bit_stream.rb +180 -0
- data/lib/omnizip/formats/rar/compression/dispatcher.rb +217 -0
- data/lib/omnizip/formats/rar/compression/lz77_huffman/decoder.rb +216 -0
- data/lib/omnizip/formats/rar/compression/lz77_huffman/encoder.rb +158 -0
- data/lib/omnizip/formats/rar/compression/lz77_huffman/huffman_builder.rb +217 -0
- data/lib/omnizip/formats/rar/compression/lz77_huffman/huffman_coder.rb +189 -0
- data/lib/omnizip/formats/rar/compression/lz77_huffman/match_finder.rb +135 -0
- data/lib/omnizip/formats/rar/compression/lz77_huffman/sliding_window.rb +165 -0
- data/lib/omnizip/formats/rar/compression/ppmd/context.rb +105 -0
- data/lib/omnizip/formats/rar/compression/ppmd/decoder.rb +219 -0
- data/lib/omnizip/formats/rar/compression/ppmd/encoder.rb +262 -0
- data/lib/omnizip/formats/rar/compression_method_registry.rb +106 -0
- data/lib/omnizip/formats/rar/constants.rb +82 -0
- data/lib/omnizip/formats/rar/decompressor.rb +238 -0
- data/lib/omnizip/formats/rar/external_writer.rb +312 -0
- data/lib/omnizip/formats/rar/header.rb +192 -0
- data/lib/omnizip/formats/rar/license_validator.rb +109 -0
- data/lib/omnizip/formats/rar/models/rar_archive.rb +77 -0
- data/lib/omnizip/formats/rar/models/rar_entry.rb +65 -0
- data/lib/omnizip/formats/rar/models/rar_volume.rb +56 -0
- data/lib/omnizip/formats/rar/parity_handler.rb +292 -0
- data/lib/omnizip/formats/rar/rar5/compression/lzma.rb +202 -0
- data/lib/omnizip/formats/rar/rar5/compression/lzss.rb +578 -0
- data/lib/omnizip/formats/rar/rar5/compression/store.rb +60 -0
- data/lib/omnizip/formats/rar/rar5/crc32.rb +39 -0
- data/lib/omnizip/formats/rar/rar5/encryption/aes256_cbc.rb +97 -0
- data/lib/omnizip/formats/rar/rar5/encryption/encryption_header.rb +114 -0
- data/lib/omnizip/formats/rar/rar5/encryption/encryption_manager.rb +166 -0
- data/lib/omnizip/formats/rar/rar5/encryption/key_derivation.rb +97 -0
- data/lib/omnizip/formats/rar/rar5/header.rb +187 -0
- data/lib/omnizip/formats/rar/rar5/models/encryption_options.rb +74 -0
- data/lib/omnizip/formats/rar/rar5/models/recovery_options.rb +63 -0
- data/lib/omnizip/formats/rar/rar5/models/solid_options.rb +63 -0
- data/lib/omnizip/formats/rar/rar5/models/volume_options.rb +74 -0
- data/lib/omnizip/formats/rar/rar5/multi_volume/ARCHITECTURE.md +290 -0
- data/lib/omnizip/formats/rar/rar5/multi_volume/volume_manager.rb +264 -0
- data/lib/omnizip/formats/rar/rar5/multi_volume/volume_splitter.rb +155 -0
- data/lib/omnizip/formats/rar/rar5/multi_volume/volume_writer.rb +194 -0
- data/lib/omnizip/formats/rar/rar5/solid/solid_encoder.rb +109 -0
- data/lib/omnizip/formats/rar/rar5/solid/solid_manager.rb +142 -0
- data/lib/omnizip/formats/rar/rar5/solid/solid_stream.rb +121 -0
- data/lib/omnizip/formats/rar/rar5/vint.rb +65 -0
- data/lib/omnizip/formats/rar/rar5/writer.rb +466 -0
- data/lib/omnizip/formats/rar/rar_format_base.rb +241 -0
- data/lib/omnizip/formats/rar/reader.rb +366 -0
- data/lib/omnizip/formats/rar/recovery_record.rb +245 -0
- data/lib/omnizip/formats/rar/volume_manager.rb +168 -0
- data/lib/omnizip/formats/rar/writer.rb +431 -0
- data/lib/omnizip/formats/rar.rb +205 -0
- data/lib/omnizip/formats/rar3/compressor.rb +73 -0
- data/lib/omnizip/formats/rar3/decompressor.rb +66 -0
- data/lib/omnizip/formats/rar3/reader.rb +386 -0
- data/lib/omnizip/formats/rar3/writer.rb +219 -0
- data/lib/omnizip/formats/rar5/compressor.rb +73 -0
- data/lib/omnizip/formats/rar5/decompressor.rb +66 -0
- data/lib/omnizip/formats/rar5/reader.rb +342 -0
- data/lib/omnizip/formats/rar5/writer.rb +214 -0
- data/lib/omnizip/formats/seven_zip/coder_chain.rb +150 -0
- data/lib/omnizip/formats/seven_zip/constants.rb +126 -0
- data/lib/omnizip/formats/seven_zip/encoded_header.rb +114 -0
- data/lib/omnizip/formats/seven_zip/encrypted_header.rb +142 -0
- data/lib/omnizip/formats/seven_zip/file_collector.rb +144 -0
- data/lib/omnizip/formats/seven_zip/header.rb +106 -0
- data/lib/omnizip/formats/seven_zip/header_encryptor.rb +134 -0
- data/lib/omnizip/formats/seven_zip/header_writer.rb +466 -0
- data/lib/omnizip/formats/seven_zip/models/coder_info.rb +30 -0
- data/lib/omnizip/formats/seven_zip/models/file_entry.rb +58 -0
- data/lib/omnizip/formats/seven_zip/models/folder.rb +69 -0
- data/lib/omnizip/formats/seven_zip/models/stream_info.rb +42 -0
- data/lib/omnizip/formats/seven_zip/parser.rb +660 -0
- data/lib/omnizip/formats/seven_zip/reader.rb +458 -0
- data/lib/omnizip/formats/seven_zip/split_archive_reader.rb +632 -0
- data/lib/omnizip/formats/seven_zip/split_archive_writer.rb +315 -0
- data/lib/omnizip/formats/seven_zip/stream_compressor.rb +151 -0
- data/lib/omnizip/formats/seven_zip/stream_decompressor.rb +162 -0
- data/lib/omnizip/formats/seven_zip/writer.rb +740 -0
- data/lib/omnizip/formats/seven_zip.rb +93 -0
- data/lib/omnizip/formats/tar/constants.rb +73 -0
- data/lib/omnizip/formats/tar/entry.rb +94 -0
- data/lib/omnizip/formats/tar/header.rb +168 -0
- data/lib/omnizip/formats/tar/reader.rb +121 -0
- data/lib/omnizip/formats/tar/writer.rb +216 -0
- data/lib/omnizip/formats/tar.rb +84 -0
- data/lib/omnizip/formats/xz/reader.rb +116 -0
- data/lib/omnizip/formats/xz.rb +237 -0
- data/lib/omnizip/formats/xz_impl/block_decoder.rb +754 -0
- data/lib/omnizip/formats/xz_impl/block_encoder.rb +306 -0
- data/lib/omnizip/formats/xz_impl/block_header.rb +210 -0
- data/lib/omnizip/formats/xz_impl/block_header_parser.rb +186 -0
- data/lib/omnizip/formats/xz_impl/constants.rb +49 -0
- data/lib/omnizip/formats/xz_impl/index_decoder.rb +174 -0
- data/lib/omnizip/formats/xz_impl/index_encoder.rb +122 -0
- data/lib/omnizip/formats/xz_impl/stream_decoder.rb +468 -0
- data/lib/omnizip/formats/xz_impl/stream_encoder.rb +99 -0
- data/lib/omnizip/formats/xz_impl/stream_footer.rb +81 -0
- data/lib/omnizip/formats/xz_impl/stream_footer_parser.rb +117 -0
- data/lib/omnizip/formats/xz_impl/stream_header.rb +55 -0
- data/lib/omnizip/formats/xz_impl/stream_header_parser.rb +108 -0
- data/lib/omnizip/formats/xz_impl/vli.rb +128 -0
- data/lib/omnizip/formats/xz_impl/writer.rb +421 -0
- data/lib/omnizip/formats/zip/central_directory_header.rb +195 -0
- data/lib/omnizip/formats/zip/constants.rb +69 -0
- data/lib/omnizip/formats/zip/end_of_central_directory.rb +133 -0
- data/lib/omnizip/formats/zip/local_file_header.rb +138 -0
- data/lib/omnizip/formats/zip/reader.rb +250 -0
- data/lib/omnizip/formats/zip/unix_extra_field.rb +153 -0
- data/lib/omnizip/formats/zip/writer.rb +375 -0
- data/lib/omnizip/formats/zip/zip64_end_of_central_directory.rb +104 -0
- data/lib/omnizip/formats/zip/zip64_end_of_central_directory_locator.rb +66 -0
- data/lib/omnizip/formats/zip/zip64_extra_field.rb +114 -0
- data/lib/omnizip/formats/zip.rb +50 -0
- data/lib/omnizip/implementations/base/lzma2_decoder_base.rb +75 -0
- data/lib/omnizip/implementations/base/lzma2_encoder_base.rb +128 -0
- data/lib/omnizip/implementations/base/lzma_decoder_base.rb +83 -0
- data/lib/omnizip/implementations/base/lzma_encoder_base.rb +108 -0
- data/lib/omnizip/implementations/base/state_machine_base.rb +182 -0
- data/lib/omnizip/implementations/seven_zip/lzma/decoder.rb +421 -0
- data/lib/omnizip/implementations/seven_zip/lzma/encoder.rb +465 -0
- data/lib/omnizip/implementations/seven_zip/lzma/match_finder.rb +288 -0
- data/lib/omnizip/implementations/seven_zip/lzma/range_decoder.rb +200 -0
- data/lib/omnizip/implementations/seven_zip/lzma/range_encoder.rb +197 -0
- data/lib/omnizip/implementations/seven_zip/lzma/state_machine.rb +141 -0
- data/lib/omnizip/implementations/seven_zip/lzma2/encoder.rb +519 -0
- data/lib/omnizip/implementations/xz_utils/lzma2/decoder.rb +723 -0
- data/lib/omnizip/implementations/xz_utils/lzma2/encoder.rb +750 -0
- data/lib/omnizip/io/buffered_input.rb +146 -0
- data/lib/omnizip/io/buffered_output.rb +105 -0
- data/lib/omnizip/io/stream_manager.rb +115 -0
- data/lib/omnizip/link_handler/hard_link.rb +79 -0
- data/lib/omnizip/link_handler/symbolic_link.rb +74 -0
- data/lib/omnizip/link_handler.rb +124 -0
- data/lib/omnizip/metadata/archive_metadata.rb +114 -0
- data/lib/omnizip/metadata/entry_metadata.rb +146 -0
- data/lib/omnizip/metadata/metadata_editor.rb +171 -0
- data/lib/omnizip/metadata/metadata_registry.rb +64 -0
- data/lib/omnizip/metadata/metadata_validator.rb +99 -0
- data/lib/omnizip/metadata.rb +57 -0
- data/lib/omnizip/models/.keep +0 -0
- data/lib/omnizip/models/algorithm_metadata.rb +73 -0
- data/lib/omnizip/models/compression_options.rb +71 -0
- data/lib/omnizip/models/conversion_options.rb +87 -0
- data/lib/omnizip/models/conversion_result.rb +135 -0
- data/lib/omnizip/models/eta_result.rb +46 -0
- data/lib/omnizip/models/extraction_rule.rb +115 -0
- data/lib/omnizip/models/filter_chain.rb +144 -0
- data/lib/omnizip/models/filter_config.rb +183 -0
- data/lib/omnizip/models/match_result.rb +124 -0
- data/lib/omnizip/models/optimization_suggestion.rb +91 -0
- data/lib/omnizip/models/parallel_options.rb +104 -0
- data/lib/omnizip/models/performance_result.rb +79 -0
- data/lib/omnizip/models/profile_report.rb +82 -0
- data/lib/omnizip/models/progress_options.rb +38 -0
- data/lib/omnizip/models/split_options.rb +116 -0
- data/lib/omnizip/optimization_registry.rb +81 -0
- data/lib/omnizip/parallel/job_queue.rb +209 -0
- data/lib/omnizip/parallel/job_scheduler.rb +203 -0
- data/lib/omnizip/parallel/parallel_compressor.rb +347 -0
- data/lib/omnizip/parallel/parallel_extractor.rb +329 -0
- data/lib/omnizip/parallel/worker_pool.rb +223 -0
- data/lib/omnizip/parallel.rb +149 -0
- data/lib/omnizip/parity/chunked_block_processor.rb +196 -0
- data/lib/omnizip/parity/galois16.rb +145 -0
- data/lib/omnizip/parity/models/creator_packet.rb +73 -0
- data/lib/omnizip/parity/models/file_description_packet.rb +133 -0
- data/lib/omnizip/parity/models/ifsc_packet.rb +123 -0
- data/lib/omnizip/parity/models/main_packet.rb +128 -0
- data/lib/omnizip/parity/models/packet.rb +156 -0
- data/lib/omnizip/parity/models/packet_registry.rb +109 -0
- data/lib/omnizip/parity/models/recovery_slice_packet.rb +78 -0
- data/lib/omnizip/parity/par2_creator.rb +531 -0
- data/lib/omnizip/parity/par2_repairer.rb +407 -0
- data/lib/omnizip/parity/par2_verifier.rb +364 -0
- data/lib/omnizip/parity/par2cmdline_algorithm.rb +110 -0
- data/lib/omnizip/parity/par2cmdline_coefficients.rb +78 -0
- data/lib/omnizip/parity/reed_solomon_decoder.rb +266 -0
- data/lib/omnizip/parity/reed_solomon_encoder.rb +111 -0
- data/lib/omnizip/parity/reed_solomon_matrix.rb +342 -0
- data/lib/omnizip/parity.rb +186 -0
- data/lib/omnizip/password/encryption_registry.rb +65 -0
- data/lib/omnizip/password/encryption_strategy.rb +96 -0
- data/lib/omnizip/password/password_validator.rb +129 -0
- data/lib/omnizip/password/winzip_aes_strategy.rb +192 -0
- data/lib/omnizip/password/zip_crypto_strategy.rb +141 -0
- data/lib/omnizip/password.rb +87 -0
- data/lib/omnizip/pipe/stream_compressor.rb +124 -0
- data/lib/omnizip/pipe/stream_decompressor.rb +174 -0
- data/lib/omnizip/pipe.rb +121 -0
- data/lib/omnizip/platform/ntfs_streams.rb +201 -0
- data/lib/omnizip/platform.rb +189 -0
- data/lib/omnizip/profile/archive_profile.rb +39 -0
- data/lib/omnizip/profile/balanced_profile.rb +33 -0
- data/lib/omnizip/profile/binary_profile.rb +36 -0
- data/lib/omnizip/profile/compression_profile.rb +158 -0
- data/lib/omnizip/profile/custom_profile.rb +157 -0
- data/lib/omnizip/profile/fast_profile.rb +33 -0
- data/lib/omnizip/profile/maximum_profile.rb +33 -0
- data/lib/omnizip/profile/profile_detector.rb +110 -0
- data/lib/omnizip/profile/profile_registry.rb +161 -0
- data/lib/omnizip/profile/text_profile.rb +36 -0
- data/lib/omnizip/profile.rb +190 -0
- data/lib/omnizip/profiler/memory_profiler.rb +66 -0
- data/lib/omnizip/profiler/method_profiler.rb +49 -0
- data/lib/omnizip/profiler/report_generator.rb +169 -0
- data/lib/omnizip/profiler.rb +204 -0
- data/lib/omnizip/progress/callback_reporter.rb +36 -0
- data/lib/omnizip/progress/console_reporter.rb +62 -0
- data/lib/omnizip/progress/log_reporter.rb +91 -0
- data/lib/omnizip/progress/operation_progress.rb +118 -0
- data/lib/omnizip/progress/progress_bar.rb +156 -0
- data/lib/omnizip/progress/progress_reporter.rb +40 -0
- data/lib/omnizip/progress/progress_tracker.rb +190 -0
- data/lib/omnizip/progress/silent_reporter.rb +24 -0
- data/lib/omnizip/progress.rb +127 -0
- data/lib/omnizip/rubyzip_compat.rb +63 -0
- data/lib/omnizip/temp/safe_extract.rb +168 -0
- data/lib/omnizip/temp/temp_file.rb +124 -0
- data/lib/omnizip/temp/temp_file_pool.rb +109 -0
- data/lib/omnizip/temp.rb +181 -0
- data/lib/omnizip/version.rb +5 -0
- data/lib/omnizip/zip/entry.rb +156 -0
- data/lib/omnizip/zip/file.rb +485 -0
- data/lib/omnizip/zip/input_stream.rb +273 -0
- data/lib/omnizip/zip/output_stream.rb +324 -0
- data/lib/omnizip.rb +156 -0
- data/readme-docs/advanced-features.adoc +515 -0
- data/readme-docs/api-usage.adoc +444 -0
- data/readme-docs/architecture.adoc +449 -0
- data/readme-docs/archive-formats.adoc +479 -0
- data/readme-docs/cli-usage.adoc +222 -0
- data/readme-docs/compression-algorithms.adoc +442 -0
- data/readme-docs/compression-profiles.adoc +247 -0
- data/readme-docs/encryption-checksums.adoc +328 -0
- data/readme-docs/format-converter.adoc +325 -0
- data/readme-docs/installation.adoc +228 -0
- data/readme-docs/par2-archives.adoc +608 -0
- data/readme-docs/performance-profiler.adoc +389 -0
- data/readme-docs/preprocessing-filters.adoc +280 -0
- data/xz-file-format-1.2.1.txt +1174 -0
- metadata +617 -0
|
@@ -0,0 +1,521 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: RAR5 Format Support
|
|
3
|
+
nav_order: 7
|
|
4
|
+
parent: Archive Formats
|
|
5
|
+
grand_parent: Guides
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
== RAR5 Format Support
|
|
9
|
+
|
|
10
|
+
Complete documentation for RAR5 archive creation and extraction in Omnizip v0.3.0.
|
|
11
|
+
|
|
12
|
+
=== Overview
|
|
13
|
+
|
|
14
|
+
RAR5 is the latest version of the RAR archive format, introduced in WinRAR 5.0. It features improved compression algorithms, better recovery records, and enhanced encryption compared to RAR4.
|
|
15
|
+
|
|
16
|
+
**Status in Omnizip v0.3.0:**
|
|
17
|
+
|
|
18
|
+
* ✅ **Read support:** Full RAR5 extraction with all compression methods
|
|
19
|
+
* ✅ **Write support:** STORE and LZMA compression (5 levels)
|
|
20
|
+
* ✅ **Multi-volume archives:** Split archives across multiple volumes
|
|
21
|
+
* ✅ **Solid archives:** Full support for solid compression
|
|
22
|
+
* ✅ **Unicode filenames:** UTF-8 support
|
|
23
|
+
* ✅ **Symlinks and hardlinks:** Full support
|
|
24
|
+
* ✅ **Error handling:** Graceful handling of truncated/invalid files
|
|
25
|
+
* ✅ **Pure Ruby:** Zero external dependencies
|
|
26
|
+
* ✅ **Format compliant:** Archives compatible with official `unrar`
|
|
27
|
+
* ✅ **libarchive compatibility:** 51 test files verified
|
|
28
|
+
|
|
29
|
+
=== Compression Methods
|
|
30
|
+
|
|
31
|
+
RAR5 supports multiple compression methods. Omnizip v0.5.0 implements:
|
|
32
|
+
|
|
33
|
+
==== STORE (Method 0)
|
|
34
|
+
|
|
35
|
+
Uncompressed storage - files are copied directly into the archive without compression.
|
|
36
|
+
|
|
37
|
+
**Use cases:**
|
|
38
|
+
* Already compressed files (JPEG, MP4, ZIP)
|
|
39
|
+
* Small files where compression overhead isn't worth it
|
|
40
|
+
* Maximum extraction speed required
|
|
41
|
+
|
|
42
|
+
**Performance:**
|
|
43
|
+
* Instant compression
|
|
44
|
+
* Zero CPU overhead
|
|
45
|
+
* Archive size = sum of file sizes
|
|
46
|
+
|
|
47
|
+
==== LZMA (Methods 1-5)
|
|
48
|
+
|
|
49
|
+
LZMA (Lempel-Ziv-Markov chain Algorithm) with configurable dictionary sizes for different compression/speed trade-offs.
|
|
50
|
+
|
|
51
|
+
[cols="1,2,2,3",options="header"]
|
|
52
|
+
|===
|
|
53
|
+
|Level |Dictionary |Speed |Use Case
|
|
54
|
+
|
|
55
|
+
|1
|
|
56
|
+
|256 KB
|
|
57
|
+
|Fastest
|
|
58
|
+
|Quick backups, already compressed data
|
|
59
|
+
|
|
60
|
+
|2
|
|
61
|
+
|1 MB
|
|
62
|
+
|Fast
|
|
63
|
+
|General purpose, good balance
|
|
64
|
+
|
|
65
|
+
|3
|
|
66
|
+
|4 MB
|
|
67
|
+
|Normal
|
|
68
|
+
|Default - good compression with reasonable speed
|
|
69
|
+
|
|
70
|
+
|4
|
|
71
|
+
|8 MB
|
|
72
|
+
|Good
|
|
73
|
+
|Better compression for larger files
|
|
74
|
+
|
|
75
|
+
|5
|
|
76
|
+
|16 MB
|
|
77
|
+
|Best
|
|
78
|
+
|Maximum compression, archives for distribution
|
|
79
|
+
|===
|
|
80
|
+
|
|
81
|
+
**Performance (Pure Ruby):**
|
|
82
|
+
* 10-60x slower than native WinRAR (level-dependent)
|
|
83
|
+
* Memory usage: < 2-3x input size
|
|
84
|
+
* Trade-off: Complete portability without native extensions
|
|
85
|
+
|
|
86
|
+
=== Multi-Volume Archives *(NEW in v0.5.0)*
|
|
87
|
+
|
|
88
|
+
Split large archives across multiple volume files for distribution on size-constrained media or network uploads.
|
|
89
|
+
|
|
90
|
+
==== Features
|
|
91
|
+
|
|
92
|
+
* **Configurable split size:** Specify maximum volume size (e.g., "10M", "100M", "1G")
|
|
93
|
+
* **Three naming patterns:**
|
|
94
|
+
- `part`: archive.part1.rar, archive.part2.rar, ... (default)
|
|
95
|
+
- `volume`: archive.vol1.rar, archive.vol2.rar, ...
|
|
96
|
+
- `numeric`: archive.rar, archive.r00, archive.r01, ...
|
|
97
|
+
* **Atomic file placement:** Files are not split mid-stream (v0.5.0 limitation)
|
|
98
|
+
* **Compression support:** Works with both STORE and LZMA
|
|
99
|
+
* **Format compliant:** Extracts correctly with `unrar`
|
|
100
|
+
|
|
101
|
+
==== Basic Usage
|
|
102
|
+
|
|
103
|
+
[source,ruby]
|
|
104
|
+
----
|
|
105
|
+
# Create multi-volume archive (10 MB per volume)
|
|
106
|
+
writer = Omnizip::Formats::Rar::Rar5::Writer.new('archive.rar',
|
|
107
|
+
multi_volume: true,
|
|
108
|
+
volume_size: '10M',
|
|
109
|
+
compression: :lzma,
|
|
110
|
+
level: 5
|
|
111
|
+
)
|
|
112
|
+
writer.add_directory('large_dataset/')
|
|
113
|
+
volumes = writer.write
|
|
114
|
+
# Returns: ['archive.part1.rar', 'archive.part2.rar', ...]
|
|
115
|
+
|
|
116
|
+
# Create with numeric naming
|
|
117
|
+
writer = Omnizip::Formats::Rar::Rar5::Writer.new('backup.rar',
|
|
118
|
+
multi_volume: true,
|
|
119
|
+
volume_size: '100M',
|
|
120
|
+
volume_naming: 'numeric'
|
|
121
|
+
)
|
|
122
|
+
writer.add_file('huge_file.dat')
|
|
123
|
+
volumes = writer.write
|
|
124
|
+
# Returns: ['backup.rar', 'backup.r00', 'backup.r01', ...]
|
|
125
|
+
----
|
|
126
|
+
|
|
127
|
+
==== Volume Size Specification
|
|
128
|
+
|
|
129
|
+
**Human-readable formats:**
|
|
130
|
+
```ruby
|
|
131
|
+
volume_size: '10K' # 10 kilobytes
|
|
132
|
+
volume_size: '50M' # 50 megabytes
|
|
133
|
+
volume_size: '1G' # 1 gigabyte
|
|
134
|
+
volume_size: '2T' # 2 terabytes
|
|
135
|
+
|
|
136
|
+
# Or integer bytes
|
|
137
|
+
volume_size: 10_485_760 # 10 MB in bytes
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
**Minimum size:** 64 KB (enforced by validation)
|
|
141
|
+
|
|
142
|
+
==== CLI Usage
|
|
143
|
+
|
|
144
|
+
[source,sh]
|
|
145
|
+
----
|
|
146
|
+
# Create multi-volume archive
|
|
147
|
+
omnizip archive create archive.rar large_files/ \
|
|
148
|
+
--split-size 10M --algorithm lzma --level 5
|
|
149
|
+
|
|
150
|
+
# With numeric naming
|
|
151
|
+
omnizip archive create backup.rar data/ \
|
|
152
|
+
--split-size 100M --volume-naming numeric
|
|
153
|
+
----
|
|
154
|
+
|
|
155
|
+
==== Use Cases
|
|
156
|
+
|
|
157
|
+
* **DVD/Blu-ray distribution:** Split to fit disc capacity
|
|
158
|
+
* **Email attachments:** Split into attachment-size chunks
|
|
159
|
+
* **Cloud uploads:** Respect size limits (e.g., 100MB per file)
|
|
160
|
+
* **Network transfers:** Resumable downloads via individual volumes
|
|
161
|
+
|
|
162
|
+
==== Current Limitations
|
|
163
|
+
|
|
164
|
+
* **No file spanning:** Individual files cannot span multiple volumes (files must fit in single volume)
|
|
165
|
+
* **Sequential creation:** Volumes created one at a time (no parallelization in v0.5.0)
|
|
166
|
+
|
|
167
|
+
=== Optional Fields
|
|
168
|
+
|
|
169
|
+
RAR5 supports optional metadata fields for enhanced archive information.
|
|
170
|
+
|
|
171
|
+
==== Modification Time (mtime)
|
|
172
|
+
|
|
173
|
+
Preserves file modification timestamps in the archive.
|
|
174
|
+
|
|
175
|
+
**Format:** 64-bit Windows FILETIME (100-nanosecond intervals since 1601-01-01)
|
|
176
|
+
|
|
177
|
+
**Usage:**
|
|
178
|
+
[source,ruby]
|
|
179
|
+
----
|
|
180
|
+
writer = Omnizip::Formats::Rar::Rar5::Writer.new('archive.rar',
|
|
181
|
+
include_mtime: true
|
|
182
|
+
)
|
|
183
|
+
----
|
|
184
|
+
|
|
185
|
+
**Compatibility:** Works with all compression methods (STORE, LZMA)
|
|
186
|
+
|
|
187
|
+
==== CRC32 Checksum
|
|
188
|
+
|
|
189
|
+
**CRITICAL LIMITATION:** CRC32 optional field is only compatible with STORE compression.
|
|
190
|
+
|
|
191
|
+
**Why this limitation exists:**
|
|
192
|
+
|
|
193
|
+
RAR5 format specification requires that compressed files use only the BLAKE2sp checksum (always present in the main file header) for integrity verification. The optional CRC32 field was designed for uncompressed (STORE) files to provide additional integrity checking during transmission or storage.
|
|
194
|
+
|
|
195
|
+
**Behavior:**
|
|
196
|
+
* With STORE: CRC32 is included if requested
|
|
197
|
+
* With LZMA: CRC32 is automatically disabled (no error)
|
|
198
|
+
* BLAKE2sp checksum is always present regardless of compression
|
|
199
|
+
|
|
200
|
+
**Usage:**
|
|
201
|
+
[source,ruby]
|
|
202
|
+
----
|
|
203
|
+
# CRC32 works with STORE
|
|
204
|
+
writer = Omnizip::Formats::Rar::Rar5::Writer.new('archive.rar',
|
|
205
|
+
compression: :store,
|
|
206
|
+
include_crc32: true # ✅ Will be included
|
|
207
|
+
)
|
|
208
|
+
|
|
209
|
+
# CRC32 auto-disabled with LZMA
|
|
210
|
+
writer = Omnizip::Formats::Rar::Rar5::Writer.new('archive.rar',
|
|
211
|
+
compression: :lzma,
|
|
212
|
+
include_crc32: true # ⚠️ Silently disabled
|
|
213
|
+
)
|
|
214
|
+
# Archive will use BLAKE2sp only (standard behavior)
|
|
215
|
+
----
|
|
216
|
+
|
|
217
|
+
=== Creating RAR5 Archives
|
|
218
|
+
|
|
219
|
+
==== Basic Usage
|
|
220
|
+
|
|
221
|
+
[source,ruby]
|
|
222
|
+
----
|
|
223
|
+
require 'omnizip/formats/rar/rar5/writer'
|
|
224
|
+
|
|
225
|
+
# Create with default settings (STORE compression)
|
|
226
|
+
writer = Omnizip::Formats::Rar::Rar5::Writer.new('archive.rar')
|
|
227
|
+
writer.add_file('document.txt')
|
|
228
|
+
writer.add_file('image.png')
|
|
229
|
+
writer.write
|
|
230
|
+
writer.close
|
|
231
|
+
----
|
|
232
|
+
|
|
233
|
+
==== LZMA Compression
|
|
234
|
+
|
|
235
|
+
[source,ruby]
|
|
236
|
+
----
|
|
237
|
+
# Default LZMA level (3 = normal)
|
|
238
|
+
writer = Omnizip::Formats::Rar::Rar5::Writer.new('archive.rar',
|
|
239
|
+
compression: :lzma
|
|
240
|
+
)
|
|
241
|
+
writer.add_file('large_dataset.json')
|
|
242
|
+
writer.write
|
|
243
|
+
|
|
244
|
+
# LZMA level 5 (best compression)
|
|
245
|
+
writer = Omnizip::Formats::Rar::Rar5::Writer.new('archive.rar',
|
|
246
|
+
compression: :lzma,
|
|
247
|
+
level: 5
|
|
248
|
+
)
|
|
249
|
+
writer.add_directory('photos/')
|
|
250
|
+
writer.write
|
|
251
|
+
|
|
252
|
+
# LZMA level 1 (fastest)
|
|
253
|
+
writer = Omnizip::Formats::Rar::Rar5::Writer.new('archive.rar',
|
|
254
|
+
compression: :lzma,
|
|
255
|
+
level: 1
|
|
256
|
+
)
|
|
257
|
+
writer.add_file('temp_data.bin')
|
|
258
|
+
writer.write
|
|
259
|
+
----
|
|
260
|
+
|
|
261
|
+
==== Auto-Compression Selection
|
|
262
|
+
|
|
263
|
+
Automatically choose STORE for small files (<1KB) and LZMA for larger files:
|
|
264
|
+
|
|
265
|
+
[source,ruby]
|
|
266
|
+
----
|
|
267
|
+
writer = Omnizip::Formats::Rar::Rar5::Writer.new('archive.rar',
|
|
268
|
+
compression: :auto, # Smart selection
|
|
269
|
+
level: 3 # LZMA level when auto selects it
|
|
270
|
+
)
|
|
271
|
+
writer.add_file('small_config.txt') # → STORE
|
|
272
|
+
writer.add_file('large_dataset.csv') # → LZMA level 3
|
|
273
|
+
writer.write
|
|
274
|
+
----
|
|
275
|
+
|
|
276
|
+
==== Combined Features
|
|
277
|
+
|
|
278
|
+
[source,ruby]
|
|
279
|
+
----
|
|
280
|
+
# Multi-volume with LZMA compression and mtime
|
|
281
|
+
writer = Omnizip::Formats::Rar::Rar5::Writer.new('backup.rar',
|
|
282
|
+
compression: :lzma,
|
|
283
|
+
level: 4,
|
|
284
|
+
include_mtime: true,
|
|
285
|
+
multi_volume: true,
|
|
286
|
+
volume_size: '50M'
|
|
287
|
+
)
|
|
288
|
+
writer.add_directory('project/')
|
|
289
|
+
volumes = writer.write
|
|
290
|
+
# Creates: backup.part1.rar, backup.part2.rar, ...
|
|
291
|
+
----
|
|
292
|
+
|
|
293
|
+
==== Block Syntax
|
|
294
|
+
|
|
295
|
+
[source,ruby]
|
|
296
|
+
----
|
|
297
|
+
Omnizip::Formats::Rar::Rar5::Writer.new('archive.rar',
|
|
298
|
+
compression: :lzma,
|
|
299
|
+
level: 5
|
|
300
|
+
) do |writer|
|
|
301
|
+
writer.add_file('report.pdf')
|
|
302
|
+
writer.add_directory('data/')
|
|
303
|
+
end
|
|
304
|
+
# Automatically calls write() and close()
|
|
305
|
+
----
|
|
306
|
+
|
|
307
|
+
=== CLI Usage
|
|
308
|
+
|
|
309
|
+
Create RAR5 archives using the command-line interface:
|
|
310
|
+
|
|
311
|
+
[source,sh]
|
|
312
|
+
----
|
|
313
|
+
# Create with STORE compression (default)
|
|
314
|
+
omnizip archive create archive.rar file1.txt file2.txt
|
|
315
|
+
|
|
316
|
+
# Create with LZMA compression (level 3 default)
|
|
317
|
+
omnizip archive create archive.rar documents/ --algorithm lzma
|
|
318
|
+
|
|
319
|
+
# Create with LZMA level 5 (best)
|
|
320
|
+
omnizip archive create archive.rar datasets/ --algorithm lzma --level 5
|
|
321
|
+
|
|
322
|
+
# Create with LZMA level 1 (fastest)
|
|
323
|
+
omnizip archive create archive.rar temp/ --algorithm lzma --level 1
|
|
324
|
+
|
|
325
|
+
# Include modification time
|
|
326
|
+
omnizip archive create archive.rar photos/ --include-mtime
|
|
327
|
+
|
|
328
|
+
# Include CRC32 (STORE compression only)
|
|
329
|
+
omnizip archive create archive.rar data/ --algorithm store --include-crc32
|
|
330
|
+
|
|
331
|
+
# Multi-volume archive
|
|
332
|
+
omnizip archive create archive.rar large_data/ --split-size 10M --algorithm lzma
|
|
333
|
+
----
|
|
334
|
+
|
|
335
|
+
=== Extracting RAR5 Archives
|
|
336
|
+
|
|
337
|
+
Omnizip provides full RAR5 archive reading support with all compression methods:
|
|
338
|
+
|
|
339
|
+
[source,ruby]
|
|
340
|
+
----
|
|
341
|
+
require 'omnizip/formats/rar5/reader'
|
|
342
|
+
|
|
343
|
+
# Read and list files
|
|
344
|
+
reader = Omnizip::Formats::Rar5::Reader.new
|
|
345
|
+
File.open('archive.rar', 'rb') do |io|
|
|
346
|
+
entries = reader.read_archive(io)
|
|
347
|
+
|
|
348
|
+
entries.each do |entry|
|
|
349
|
+
puts "#{entry.name}: #{entry.uncompressed_size} bytes"
|
|
350
|
+
puts " Compressed: #{entry.compressed_size} bytes"
|
|
351
|
+
puts " Method: #{entry.compression_method}"
|
|
352
|
+
puts " Modified: #{entry.modified_time}"
|
|
353
|
+
puts " CRC32: #{entry.crc32.to_s(16)}"
|
|
354
|
+
puts " Directory: #{entry.is_directory}"
|
|
355
|
+
end
|
|
356
|
+
end
|
|
357
|
+
----
|
|
358
|
+
|
|
359
|
+
**Reader Features:**
|
|
360
|
+
|
|
361
|
+
* ✅ All compression methods (STORE, LZSS)
|
|
362
|
+
* ✅ Solid archive support
|
|
363
|
+
* ✅ Unicode filenames (UTF-8)
|
|
364
|
+
* ✅ Symlink and hardlink detection
|
|
365
|
+
* ✅ Multi-file archives
|
|
366
|
+
* ✅ Graceful error handling for truncated/invalid files
|
|
367
|
+
* ✅ Proper header position tracking with bounds checking
|
|
368
|
+
|
|
369
|
+
=== Performance Characteristics
|
|
370
|
+
|
|
371
|
+
==== Compression Speed
|
|
372
|
+
|
|
373
|
+
Pure Ruby implementation (portable):
|
|
374
|
+
|
|
375
|
+
[cols="2,3,3",options="header"]
|
|
376
|
+
|===
|
|
377
|
+
|Method |Speed vs Native |Use Case
|
|
378
|
+
|
|
379
|
+
|STORE
|
|
380
|
+
|~1x (no compression)
|
|
381
|
+
|Instant archiving
|
|
382
|
+
|
|
383
|
+
|LZMA Level 1
|
|
384
|
+
|~10-15x slower
|
|
385
|
+
|Quick backups
|
|
386
|
+
|
|
387
|
+
|LZMA Level 3
|
|
388
|
+
|~20-30x slower
|
|
389
|
+
|General purpose
|
|
390
|
+
|
|
391
|
+
|LZMA Level 5
|
|
392
|
+
|~40-60x slower
|
|
393
|
+
|Distribution archives
|
|
394
|
+
|===
|
|
395
|
+
|
|
396
|
+
==== Memory Usage
|
|
397
|
+
|
|
398
|
+
* STORE: Minimal (< 0.5x input size)
|
|
399
|
+
* LZMA: < 2-3x input size (level-dependent)
|
|
400
|
+
* Multi-volume: Compresses all files upfront (v0.5.0)
|
|
401
|
+
* Streaming support for large files (>100MB)
|
|
402
|
+
|
|
403
|
+
==== Trade-offs
|
|
404
|
+
|
|
405
|
+
**Pure Ruby advantages:**
|
|
406
|
+
* ✅ Works on all Ruby platforms (MRI, JRuby, TruffleRuby)
|
|
407
|
+
* ✅ Zero external dependencies
|
|
408
|
+
* ✅ Complete portability
|
|
409
|
+
* ✅ No compilation or native extensions
|
|
410
|
+
|
|
411
|
+
**Performance trade-off:**
|
|
412
|
+
* ⚠️ 10-60x slower than native implementations
|
|
413
|
+
* ✅ Acceptable for most use cases (< 1GB archives)
|
|
414
|
+
* ✅ Can process 100MB files in reasonable time
|
|
415
|
+
|
|
416
|
+
=== Format Compliance
|
|
417
|
+
|
|
418
|
+
Omnizip's RAR5 implementation follows the official RAR5 format specification:
|
|
419
|
+
|
|
420
|
+
* **Archive signature:** Correct RAR 5.0 magic bytes (`0x52 0x61 0x72 0x21 0x1A 0x07 0x01 0x00`)
|
|
421
|
+
* **Header structure:** Compliant main archive header and file headers
|
|
422
|
+
* **Multi-volume flags:** Proper VOLUME_ARCHIVE_FLAG and volume numbering
|
|
423
|
+
* **Checksum algorithm:** BLAKE2sp for all files (CRC32 optional for STORE)
|
|
424
|
+
* **LZMA encoding:** Standard LZMA parameters compatible with 7-Zip SDK
|
|
425
|
+
* **Compatibility:** Archives extract correctly with official `unrar` 5.0+
|
|
426
|
+
|
|
427
|
+
=== Current Limitations
|
|
428
|
+
|
|
429
|
+
==== Known Issues (v0.3.0)
|
|
430
|
+
|
|
431
|
+
* **CRC32 limitation:** Only works with STORE compression (format requirement)
|
|
432
|
+
* **Large files:** >1GB files may be slow with pure Ruby LZMA
|
|
433
|
+
- Consider using STORE for very large files
|
|
434
|
+
- Or use 7z format with same algorithms for better performance
|
|
435
|
+
* **Multi-volume memory:** All files compressed upfront
|
|
436
|
+
- Sequential/streaming compression planned for future release
|
|
437
|
+
|
|
438
|
+
==== Deferred to v0.4.0
|
|
439
|
+
|
|
440
|
+
* **PPMd compression:** Prediction by Partial Matching encoder/decoder synchronization
|
|
441
|
+
* **Zstandard compression:** RFC 8878 implementation required
|
|
442
|
+
|
|
443
|
+
=== Examples
|
|
444
|
+
|
|
445
|
+
==== Backup Script
|
|
446
|
+
|
|
447
|
+
[source,ruby]
|
|
448
|
+
----
|
|
449
|
+
require 'omnizip/formats/rar/rar5/writer'
|
|
450
|
+
|
|
451
|
+
# Backup documents with LZMA compression
|
|
452
|
+
def backup_documents(source_dir, backup_file)
|
|
453
|
+
Omnizip::Formats::Rar::Rar5::Writer.new(backup_file,
|
|
454
|
+
compression: :lzma,
|
|
455
|
+
level: 4,
|
|
456
|
+
include_mtime: true
|
|
457
|
+
) do |writer|
|
|
458
|
+
Dir.glob("#{source_dir}/**/*").each do |file|
|
|
459
|
+
next if File.directory?(file)
|
|
460
|
+
writer.add_file(file)
|
|
461
|
+
end
|
|
462
|
+
end
|
|
463
|
+
|
|
464
|
+
puts "Backup created: #{backup_file}"
|
|
465
|
+
end
|
|
466
|
+
|
|
467
|
+
backup_documents('~/Documents', 'backup.rar')
|
|
468
|
+
----
|
|
469
|
+
|
|
470
|
+
==== Multi-Volume Backup
|
|
471
|
+
|
|
472
|
+
[source,ruby]
|
|
473
|
+
----
|
|
474
|
+
# Create multi-volume backup for DVD burning
|
|
475
|
+
def create_dvd_backup(source_dir, output_base)
|
|
476
|
+
Omnizip::Formats::Rar::Rar5::Writer.new(output_base,
|
|
477
|
+
compression: :lzma,
|
|
478
|
+
level: 5,
|
|
479
|
+
multi_volume: true,
|
|
480
|
+
volume_size: '4.3G', # DVD-R capacity
|
|
481
|
+
include_mtime: true
|
|
482
|
+
) do |writer|
|
|
483
|
+
writer.add_directory(source_dir)
|
|
484
|
+
end
|
|
485
|
+
end
|
|
486
|
+
|
|
487
|
+
volumes = create_dvd_backup('~/Photos', 'photos_backup.rar')
|
|
488
|
+
puts "Created #{volumes.size} volumes for burning"
|
|
489
|
+
volumes.each { |v| puts " - #{File.basename(v)}" }
|
|
490
|
+
----
|
|
491
|
+
|
|
492
|
+
==== Archive Converter
|
|
493
|
+
|
|
494
|
+
[source,ruby]
|
|
495
|
+
----
|
|
496
|
+
# Convert ZIP to RAR5
|
|
497
|
+
def zip_to_rar5(zip_file, rar_file)
|
|
498
|
+
zip = Omnizip::Formats::Zip::Reader.new(zip_file)
|
|
499
|
+
|
|
500
|
+
Omnizip::Formats::Rar::Rar5::Writer.new(rar_file,
|
|
501
|
+
compression: :lzma,
|
|
502
|
+
level: 5
|
|
503
|
+
) do |writer|
|
|
504
|
+
zip.each_entry do |entry|
|
|
505
|
+
content = zip.read_entry(entry)
|
|
506
|
+
writer.add_data(entry.name, content)
|
|
507
|
+
end
|
|
508
|
+
end
|
|
509
|
+
|
|
510
|
+
zip.close
|
|
511
|
+
end
|
|
512
|
+
|
|
513
|
+
zip_to_rar5('archive.zip', 'archive.rar')
|
|
514
|
+
----
|
|
515
|
+
|
|
516
|
+
=== See Also
|
|
517
|
+
|
|
518
|
+
* link:../../reference/index.html[Reference Documentation]
|
|
519
|
+
* link:../creating-archives.html[Creating Archives Guide]
|
|
520
|
+
* link:../../comparison/vs-winrar.html[Omnizip vs WinRAR Comparison]
|
|
521
|
+
* https://www.rarlab.com/technote.htm[Official RAR5 Format Specification]
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: 7z Format
|
|
3
|
+
nav_order: 1
|
|
4
|
+
parent: Archive Formats
|
|
5
|
+
grand_parent: Guides
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
== 7z Format
|
|
9
|
+
|
|
10
|
+
=== General
|
|
11
|
+
|
|
12
|
+
The 7z format is a compressed archive format created by 7-Zip.
|
|
13
|
+
|
|
14
|
+
=== Features
|
|
15
|
+
|
|
16
|
+
* High compression ratio (LZMA2)
|
|
17
|
+
* Solid archives
|
|
18
|
+
* Multi-volume support
|
|
19
|
+
* AES-256 encryption
|
|
20
|
+
|
|
21
|
+
=== Usage
|
|
22
|
+
|
|
23
|
+
[source,bash]
|
|
24
|
+
----
|
|
25
|
+
# Create 7z archive
|
|
26
|
+
omnizip archive create backup.7z documents/
|
|
27
|
+
|
|
28
|
+
# Extract 7z archive
|
|
29
|
+
omnizip archive extract backup.7z output/
|
|
30
|
+
----
|
|
31
|
+
|
|
32
|
+
=== See Also
|
|
33
|
+
|
|
34
|
+
* link:../compression-algorithms/lzma2.html[LZMA2 Algorithm]
|
|
35
|
+
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: TAR Format
|
|
3
|
+
nav_order: 4
|
|
4
|
+
parent: Archive Formats
|
|
5
|
+
grand_parent: Guides
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
== Purpose
|
|
9
|
+
|
|
10
|
+
TAR (Tape Archive) is the standard archive format on Unix/Linux systems. It combines multiple files into a single archive without compression, typically paired with external compression tools.
|
|
11
|
+
|
|
12
|
+
== Key Characteristics
|
|
13
|
+
|
|
14
|
+
[cols="1,3"]
|
|
15
|
+
|===
|
|
16
|
+
|Property |Value
|
|
17
|
+
|
|
18
|
+
|Compression
|
|
19
|
+
|External (GZIP, BZip2, XZ)
|
|
20
|
+
|
|
21
|
+
|Encryption
|
|
22
|
+
|None
|
|
23
|
+
|
|
24
|
+
|POSIX Support
|
|
25
|
+
|Full POSIX.1-1988 and POSIX.1-2001
|
|
26
|
+
|
|
27
|
+
|Large Files
|
|
28
|
+
|Yes (with extensions)
|
|
29
|
+
|
|
30
|
+
|Best For
|
|
31
|
+
|Unix backups, software packaging, source distribution
|
|
32
|
+
|===
|
|
33
|
+
|
|
34
|
+
== Common TAR Variants
|
|
35
|
+
|
|
36
|
+
[cols="1,2,2"]
|
|
37
|
+
|===
|
|
38
|
+
|Extension |Compression |Typical Use
|
|
39
|
+
|
|
40
|
+
|`.tar`
|
|
41
|
+
|None
|
|
42
|
+
|Intermediate archives
|
|
43
|
+
|
|
44
|
+
|`.tar.gz` / `.tgz`
|
|
45
|
+
|GZIP (Deflate)
|
|
46
|
+
|Source distributions
|
|
47
|
+
|
|
48
|
+
|`.tar.bz2` / `.tbz2`
|
|
49
|
+
|BZip2
|
|
50
|
+
|Better compression
|
|
51
|
+
|
|
52
|
+
|`.tar.xz` / `.txz`
|
|
53
|
+
|XZ (LZMA2)
|
|
54
|
+
|Maximum compression
|
|
55
|
+
|===
|
|
56
|
+
|
|
57
|
+
== Basic Usage
|
|
58
|
+
|
|
59
|
+
=== Create TAR Archive
|
|
60
|
+
|
|
61
|
+
[source,ruby]
|
|
62
|
+
----
|
|
63
|
+
# Create uncompressed TAR
|
|
64
|
+
Omnizip::Archive.create('backup.tar', format: :tar) do |archive|
|
|
65
|
+
archive.add_directory('project/')
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
# Create TAR.GZ
|
|
69
|
+
Omnizip.compress_directory('project/', 'backup.tar.gz',
|
|
70
|
+
format: :tar_gzip,
|
|
71
|
+
level: 6
|
|
72
|
+
)
|
|
73
|
+
|
|
74
|
+
# Create TAR.XZ
|
|
75
|
+
Omnizip.compress_directory('project/', 'backup.tar.xz',
|
|
76
|
+
format: :tar_xz,
|
|
77
|
+
level: 6
|
|
78
|
+
)
|
|
79
|
+
----
|
|
80
|
+
|
|
81
|
+
=== Extract TAR Archive
|
|
82
|
+
|
|
83
|
+
[source,ruby]
|
|
84
|
+
----
|
|
85
|
+
# Extract TAR.GZ
|
|
86
|
+
Omnizip.extract_archive('backup.tar.gz', 'output/')
|
|
87
|
+
|
|
88
|
+
# Extract TAR.XZ
|
|
89
|
+
Omnizip.extract_archive('backup.tar.xz', 'output/')
|
|
90
|
+
----
|
|
91
|
+
|
|
92
|
+
== POSIX Features
|
|
93
|
+
|
|
94
|
+
Omnizip supports extended POSIX features:
|
|
95
|
+
|
|
96
|
+
* **Long filenames** (beyond 100 characters)
|
|
97
|
+
* **Symbolic links**
|
|
98
|
+
* **File permissions**
|
|
99
|
+
* **Ownership information**
|
|
100
|
+
* **Sparse files**
|
|
101
|
+
|
|
102
|
+
== See Also
|
|
103
|
+
|
|
104
|
+
* link:gzip-format.html[GZIP Format] - Common TAR compression
|
|
105
|
+
* link:xz-format.html[XZ Format] - Maximum compression for TAR
|
|
106
|
+
* link:../../compatibility.html[Compatibility] - TAR support across tools
|