mirror of
https://github.com/adamhathcock/sharpcompress.git
synced 2026-02-13 21:22:22 +00:00
Compare commits
4 Commits
copilot/su
...
presentati
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
56be4d8921 | ||
|
|
4eb3148c26 | ||
|
|
e95d543ecd | ||
|
|
33af3d552b |
247
PITCHME.md
Normal file
247
PITCHME.md
Normal file
@@ -0,0 +1,247 @@
|
|||||||
|
|
||||||
|
#### SharpCompress - Pure C# Archival and Compression
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
#### Overview
|
||||||
|
|
||||||
|
* History
|
||||||
|
* Design
|
||||||
|
* Archival Formats
|
||||||
|
* Usages (Code!)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
#### Why?
|
||||||
|
|
||||||
|
* Bored
|
||||||
|
* Interested in Comics and wanted to make my own cross-platform viewer
|
||||||
|
* Wrote a viewer in Sliverlight 2 using first versions of SharpCompress.
|
||||||
|
* Used it on OS X
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
#### Initial Version
|
||||||
|
|
||||||
|
* Started as NUnrar on Codeplex
|
||||||
|
* Used Visual Studio 2003 to convert JUnrar to C#
|
||||||
|
* Cleaned up to have a nicer API
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### More Formats
|
||||||
|
|
||||||
|
* Integrated DotNetZip
|
||||||
|
* Created Unified API
|
||||||
|
* Added Tar
|
||||||
|
* Contributions: 7Zip, LZip, more!
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Design
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Unified APIs
|
||||||
|
|
||||||
|
* Random Access
|
||||||
|
* Archive API
|
||||||
|
* Forward-only
|
||||||
|
* Reader API
|
||||||
|
* Writer API
|
||||||
|
* Neutral Factories
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Neural Factories
|
||||||
|
|
||||||
|
* Factories
|
||||||
|
* `ArchiveFactory`
|
||||||
|
* `ReaderFactory`
|
||||||
|
* `WriterFactory`
|
||||||
|
* Strategy
|
||||||
|
* Look for Archive Signatures
|
||||||
|
* "Rewind" if necessary with RewindableStream
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Random Access
|
||||||
|
|
||||||
|
* Random/Seekable access on a data stream (e.g. a File)
|
||||||
|
* Strategy
|
||||||
|
* Read Header, Skip Data
|
||||||
|
* Dictionary
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Forward-only
|
||||||
|
|
||||||
|
* Everything is a stream of data
|
||||||
|
* Support NetworkStreams
|
||||||
|
* Very large files
|
||||||
|
* `yield return` usage
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Formats
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Zip
|
||||||
|
|
||||||
|
* Header-Data Format
|
||||||
|
* Optional data trailer (forward-only writing support)
|
||||||
|
* Trailing dictionary of entries
|
||||||
|
* pkware spec - APPNOTE.txt
|
||||||
|
* Supports Reader API, Writer API and Archive API
|
||||||
|
* Compression algorthims: just about everything
|
||||||
|
* Deflate, BZ2, LZMA 1/2, PPMd
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Rar
|
||||||
|
|
||||||
|
* Header-Data Format
|
||||||
|
* SOLID is a stream of compressed header-data pairs for small files
|
||||||
|
* Multi-file archive
|
||||||
|
* Unrar open-source, rar is closed-source
|
||||||
|
* Supports Reader API and Archive API
|
||||||
|
* Compression looks to be a modification of PPMd
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 7Zip
|
||||||
|
|
||||||
|
* Multi-data compressed Format
|
||||||
|
* Headers are compressed
|
||||||
|
* Multiple compressed "streams"
|
||||||
|
* Readable Archive API support
|
||||||
|
* Annoying
|
||||||
|
* Known for LZMA
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Tar
|
||||||
|
|
||||||
|
* Header-Data Format
|
||||||
|
* Supports Reader API, Writer API and Archive API
|
||||||
|
* Uncompressed
|
||||||
|
* Many additions to out-grow limitations
|
||||||
|
* UStar
|
||||||
|
* PAX
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### GZip, BZip, LZip, Xz
|
||||||
|
|
||||||
|
* Header-Data Format of a single entry
|
||||||
|
* Supports Reader API, Writer API and Archive API
|
||||||
|
* Used with Tar
|
||||||
|
* Compression
|
||||||
|
* GZip - Deflate
|
||||||
|
* BZip2 - BZip2
|
||||||
|
* Xz - LZMA2
|
||||||
|
* LZip - LZMA1 (improvement on Xz)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Usages
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Reader
|
||||||
|
|
||||||
|
Writing entry to directory
|
||||||
|
|
||||||
|
```csharp
|
||||||
|
using (Stream stream = new NetworkStream()) // pretend
|
||||||
|
using (IReader reader = ReaderFactory.Open(stream))
|
||||||
|
{
|
||||||
|
while (reader.MoveToNextEntry())
|
||||||
|
{
|
||||||
|
if (!reader.Entry.IsDirectory)
|
||||||
|
{
|
||||||
|
reader.WriteEntryToDirectory(test.SCRATCH_FILES_PATH, new ExtractionOptions()
|
||||||
|
{
|
||||||
|
ExtractFullPath = true,
|
||||||
|
Overwrite = true
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Reader
|
||||||
|
|
||||||
|
Writing entry to a stream
|
||||||
|
|
||||||
|
```csharp
|
||||||
|
using (var reader = RarReader.Open("Rar.rar"))
|
||||||
|
{
|
||||||
|
while (reader.MoveToNextEntry())
|
||||||
|
{
|
||||||
|
if (!reader.Entry.IsDirectory)
|
||||||
|
{
|
||||||
|
using (var entryStream = reader.OpenEntryStream())
|
||||||
|
{
|
||||||
|
string file = Path.GetFileName(reader.Entry.Key);
|
||||||
|
string folder = Path.GetDirectoryName(reader.Entry.Key);
|
||||||
|
string destdir = Path.Combine(SCRATCH_FILES_PATH, folder);
|
||||||
|
if (!Directory.Exists(destdir))
|
||||||
|
{
|
||||||
|
Directory.CreateDirectory(destdir);
|
||||||
|
}
|
||||||
|
string destinationFileName = Path.Combine(destdir, file);
|
||||||
|
using (FileStream fs = File.OpenWrite(destinationFileName))
|
||||||
|
{
|
||||||
|
entryStream.TransferTo(fs);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Writer
|
||||||
|
|
||||||
|
Creating archive
|
||||||
|
|
||||||
|
```csharp
|
||||||
|
using (Stream stream = File.OpenWrite("Test.tar.lz"))
|
||||||
|
using (var writer = WriterFactory.Open(stream, ArchiveType.Tar, CompressionType.LZip))
|
||||||
|
{
|
||||||
|
writer.WriteAll("C:\", "*", SearchOption.AllDirectories);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Archive
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Projects
|
||||||
|
|
||||||
|
* Mono's Zip implementation
|
||||||
|
* Nodatime
|
||||||
|
* Octopus Deploy
|
||||||
|
* Duplicati
|
||||||
|
* Large ISO multi-file usage
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Open-source Notes
|
||||||
|
|
||||||
|
* Mostly solo effort
|
||||||
|
* A few significant contributions
|
||||||
|
* Russian friend did RarStream
|
||||||
|
* Jon Skeet contributed LZip reading
|
||||||
|
* Deflate64 recently added
|
||||||
|
* Can always use help!
|
||||||
|
* Multi-file zip support
|
||||||
|
* Encryption in various formats (some support exists)
|
||||||
|
* General clean up
|
||||||
Reference in New Issue
Block a user