Compare commits

...

4 Commits

Author SHA1 Message Date
Adam Hathcock
56be4d8921 Fleshing out a lot more 2018-03-07 08:07:32 +00:00
Adam Hathcock
4eb3148c26 Add some history 2018-03-04 11:27:57 +00:00
Adam Hathcock
e95d543ecd helps if you name the file correctly 2018-03-04 11:05:10 +00:00
Adam Hathcock
33af3d552b First test 2018-03-04 11:02:47 +00:00

247
PITCHME.md Normal file
View 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