mirror of
https://github.com/adamhathcock/sharpcompress.git
synced 2026-02-04 05:25:00 +00:00
more updates to docs
This commit is contained in:
42
docs/API.md
42
docs/API.md
@@ -8,17 +8,17 @@ Quick reference for commonly used SharpCompress APIs.
|
|||||||
|
|
||||||
```csharp
|
```csharp
|
||||||
// Auto-detect format
|
// Auto-detect format
|
||||||
using (var reader = ReaderFactory.Open(stream))
|
using (var reader = ReaderFactory.OpenReader(stream))
|
||||||
{
|
{
|
||||||
// Works with Zip, Tar, GZip, Rar, 7Zip, etc.
|
// Works with Zip, Tar, GZip, Rar, 7Zip, etc.
|
||||||
}
|
}
|
||||||
|
|
||||||
// Specific format - Archive API
|
// Specific format - Archive API
|
||||||
using (var archive = ZipArchive.Open("file.zip"))
|
using (var archive = ZipArchive.OpenArchive("file.zip"))
|
||||||
using (var archive = TarArchive.Open("file.tar"))
|
using (var archive = TarArchive.OpenArchive("file.tar"))
|
||||||
using (var archive = RarArchive.Open("file.rar"))
|
using (var archive = RarArchive.OpenArchive("file.rar"))
|
||||||
using (var archive = SevenZipArchive.Open("file.7z"))
|
using (var archive = SevenZipArchive.OpenArchive("file.7z"))
|
||||||
using (var archive = GZipArchive.Open("file.gz"))
|
using (var archive = GZipArchive.OpenArchive("file.gz"))
|
||||||
|
|
||||||
// With options
|
// With options
|
||||||
var options = new ReaderOptions
|
var options = new ReaderOptions
|
||||||
@@ -27,14 +27,14 @@ var options = new ReaderOptions
|
|||||||
LeaveStreamOpen = true,
|
LeaveStreamOpen = true,
|
||||||
ArchiveEncoding = new ArchiveEncoding { Default = Encoding.GetEncoding(932) }
|
ArchiveEncoding = new ArchiveEncoding { Default = Encoding.GetEncoding(932) }
|
||||||
};
|
};
|
||||||
using (var archive = ZipArchive.Open("encrypted.zip", options))
|
using (var archive = ZipArchive.OpenArchive("encrypted.zip", options))
|
||||||
```
|
```
|
||||||
|
|
||||||
### Creating Archives
|
### Creating Archives
|
||||||
|
|
||||||
```csharp
|
```csharp
|
||||||
// Writer Factory
|
// Writer Factory
|
||||||
using (var writer = WriterFactory.Open(stream, ArchiveType.Zip, CompressionType.Deflate))
|
using (var writer = WriterFactory.OpenWriter(stream, ArchiveType.Zip, CompressionType.Deflate))
|
||||||
{
|
{
|
||||||
// Write entries
|
// Write entries
|
||||||
}
|
}
|
||||||
@@ -63,7 +63,7 @@ using (var archive = ZipArchive.CreateArchive())
|
|||||||
### Reading/Extracting
|
### Reading/Extracting
|
||||||
|
|
||||||
```csharp
|
```csharp
|
||||||
using (var archive = ZipArchive.Open("file.zip"))
|
using (var archive = ZipArchive.OpenArchive("file.zip"))
|
||||||
{
|
{
|
||||||
// Get all entries
|
// Get all entries
|
||||||
IEnumerable<IArchiveEntry> entries = archive.Entries;
|
IEnumerable<IArchiveEntry> entries = archive.Entries;
|
||||||
@@ -151,7 +151,7 @@ using (var archive = ZipArchive.CreateArchive())
|
|||||||
|
|
||||||
```csharp
|
```csharp
|
||||||
using (var stream = File.OpenRead("file.zip"))
|
using (var stream = File.OpenRead("file.zip"))
|
||||||
using (var reader = ReaderFactory.Open(stream))
|
using (var reader = ReaderFactory.OpenReader(stream))
|
||||||
{
|
{
|
||||||
while (reader.MoveToNextEntry())
|
while (reader.MoveToNextEntry())
|
||||||
{
|
{
|
||||||
@@ -201,7 +201,7 @@ using (var reader = await ReaderFactory.OpenAsyncReader(stream))
|
|||||||
|
|
||||||
```csharp
|
```csharp
|
||||||
using (var stream = File.Create("output.zip"))
|
using (var stream = File.Create("output.zip"))
|
||||||
using (var writer = WriterFactory.Open(stream, ArchiveType.Zip, CompressionType.Deflate))
|
using (var writer = WriterFactory.OpenWriter(stream, ArchiveType.Zip, CompressionType.Deflate))
|
||||||
{
|
{
|
||||||
// Write single file
|
// Write single file
|
||||||
using (var fileStream = File.OpenRead("source.txt"))
|
using (var fileStream = File.OpenRead("source.txt"))
|
||||||
@@ -239,7 +239,7 @@ var options = new ReaderOptions
|
|||||||
Default = Encoding.GetEncoding(932)
|
Default = Encoding.GetEncoding(932)
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
using (var archive = ZipArchive.Open("file.zip", options))
|
using (var archive = ZipArchive.OpenArchive("file.zip", options))
|
||||||
{
|
{
|
||||||
// ...
|
// ...
|
||||||
}
|
}
|
||||||
@@ -290,8 +290,8 @@ ArchiveType.Ace
|
|||||||
|
|
||||||
// For Tar archives with compression
|
// For Tar archives with compression
|
||||||
// Use WriterFactory to create compressed tar archives
|
// Use WriterFactory to create compressed tar archives
|
||||||
using (var writer = WriterFactory.Open(stream, ArchiveType.Tar, CompressionType.GZip)) // Tar.GZip
|
using (var writer = WriterFactory.OpenWriter(stream, ArchiveType.Tar, CompressionType.GZip)) // Tar.GZip
|
||||||
using (var writer = WriterFactory.Open(stream, ArchiveType.Tar, CompressionType.BZip2)) // Tar.BZip2
|
using (var writer = WriterFactory.OpenWriter(stream, ArchiveType.Tar, CompressionType.BZip2)) // Tar.BZip2
|
||||||
```
|
```
|
||||||
|
|
||||||
### Archive Types
|
### Archive Types
|
||||||
@@ -349,7 +349,7 @@ var progress = new Progress<ProgressReport>(report =>
|
|||||||
});
|
});
|
||||||
|
|
||||||
var options = new ReaderOptions { Progress = progress };
|
var options = new ReaderOptions { Progress = progress };
|
||||||
using (var archive = ZipArchive.Open("archive.zip", options))
|
using (var archive = ZipArchive.OpenArchive("archive.zip", options))
|
||||||
{
|
{
|
||||||
archive.WriteToDirectory(@"C:\output");
|
archive.WriteToDirectory(@"C:\output");
|
||||||
}
|
}
|
||||||
@@ -425,7 +425,7 @@ using (var archive = ZipArchive.CreateArchive())
|
|||||||
### Extract Specific Files
|
### Extract Specific Files
|
||||||
|
|
||||||
```csharp
|
```csharp
|
||||||
using (var archive = ZipArchive.Open("archive.zip"))
|
using (var archive = ZipArchive.OpenArchive("archive.zip"))
|
||||||
{
|
{
|
||||||
var filesToExtract = new[] { "file1.txt", "file2.txt" };
|
var filesToExtract = new[] { "file1.txt", "file2.txt" };
|
||||||
|
|
||||||
@@ -439,7 +439,7 @@ using (var archive = ZipArchive.Open("archive.zip"))
|
|||||||
### List Archive Contents
|
### List Archive Contents
|
||||||
|
|
||||||
```csharp
|
```csharp
|
||||||
using (var archive = ZipArchive.Open("archive.zip"))
|
using (var archive = ZipArchive.OpenArchive("archive.zip"))
|
||||||
{
|
{
|
||||||
foreach (var entry in archive.Entries)
|
foreach (var entry in archive.Entries)
|
||||||
{
|
{
|
||||||
@@ -459,7 +459,7 @@ using (var archive = ZipArchive.Open("archive.zip"))
|
|||||||
|
|
||||||
```csharp
|
```csharp
|
||||||
var stream = File.OpenRead("archive.zip");
|
var stream = File.OpenRead("archive.zip");
|
||||||
var archive = ZipArchive.Open(stream);
|
var archive = ZipArchive.OpenArchive(stream);
|
||||||
archive.WriteToDirectory(@"C:\output");
|
archive.WriteToDirectory(@"C:\output");
|
||||||
// stream not disposed - leaked resource
|
// stream not disposed - leaked resource
|
||||||
```
|
```
|
||||||
@@ -468,7 +468,7 @@ archive.WriteToDirectory(@"C:\output");
|
|||||||
|
|
||||||
```csharp
|
```csharp
|
||||||
using (var stream = File.OpenRead("archive.zip"))
|
using (var stream = File.OpenRead("archive.zip"))
|
||||||
using (var archive = ZipArchive.Open(stream))
|
using (var archive = ZipArchive.OpenArchive(stream))
|
||||||
{
|
{
|
||||||
archive.WriteToDirectory(@"C:\output");
|
archive.WriteToDirectory(@"C:\output");
|
||||||
}
|
}
|
||||||
@@ -479,7 +479,7 @@ using (var archive = ZipArchive.Open(stream))
|
|||||||
|
|
||||||
```csharp
|
```csharp
|
||||||
// Loading entire archive then iterating
|
// Loading entire archive then iterating
|
||||||
using (var archive = ZipArchive.Open("large.zip"))
|
using (var archive = ZipArchive.OpenArchive("large.zip"))
|
||||||
{
|
{
|
||||||
var entries = archive.Entries.ToList(); // Loads all in memory
|
var entries = archive.Entries.ToList(); // Loads all in memory
|
||||||
foreach (var e in entries)
|
foreach (var e in entries)
|
||||||
@@ -494,7 +494,7 @@ using (var archive = ZipArchive.Open("large.zip"))
|
|||||||
```csharp
|
```csharp
|
||||||
// Streaming iteration
|
// Streaming iteration
|
||||||
using (var stream = File.OpenRead("large.zip"))
|
using (var stream = File.OpenRead("large.zip"))
|
||||||
using (var reader = ReaderFactory.Open(stream))
|
using (var reader = ReaderFactory.OpenReader(stream))
|
||||||
{
|
{
|
||||||
while (reader.MoveToNextEntry())
|
while (reader.MoveToNextEntry())
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -76,7 +76,7 @@ Factory classes for auto-detecting archive format and creating appropriate reade
|
|||||||
- Format-specific: `ZipFactory.cs`, `TarFactory.cs`, `RarFactory.cs`, etc.
|
- Format-specific: `ZipFactory.cs`, `TarFactory.cs`, `RarFactory.cs`, etc.
|
||||||
|
|
||||||
**How It Works:**
|
**How It Works:**
|
||||||
1. `ReaderFactory.Open(stream)` probes stream signatures
|
1. `ReaderFactory.OpenReader(stream)` probes stream signatures
|
||||||
2. Identifies format by magic bytes
|
2. Identifies format by magic bytes
|
||||||
3. Creates appropriate reader instance
|
3. Creates appropriate reader instance
|
||||||
4. Returns generic `IReader` interface
|
4. Returns generic `IReader` interface
|
||||||
@@ -142,7 +142,7 @@ Stream wrappers and utilities.
|
|||||||
**Example:**
|
**Example:**
|
||||||
```csharp
|
```csharp
|
||||||
// User calls factory
|
// User calls factory
|
||||||
using (var reader = ReaderFactory.Open(stream)) // Returns IReader
|
using (var reader = ReaderFactory.OpenReader(stream)) // Returns IReader
|
||||||
{
|
{
|
||||||
while (reader.MoveToNextEntry())
|
while (reader.MoveToNextEntry())
|
||||||
{
|
{
|
||||||
@@ -175,7 +175,7 @@ CompressionType.LZMA // LZMA
|
|||||||
CompressionType.PPMd // PPMd
|
CompressionType.PPMd // PPMd
|
||||||
|
|
||||||
// Writer uses strategy pattern
|
// Writer uses strategy pattern
|
||||||
var archive = ZipArchive.Create();
|
var archive = ZipArchive.CreateArchive();
|
||||||
archive.SaveTo("output.zip", CompressionType.Deflate); // Use Deflate
|
archive.SaveTo("output.zip", CompressionType.Deflate); // Use Deflate
|
||||||
archive.SaveTo("output.bz2", CompressionType.BZip2); // Use BZip2
|
archive.SaveTo("output.bz2", CompressionType.BZip2); // Use BZip2
|
||||||
```
|
```
|
||||||
@@ -248,7 +248,7 @@ foreach (var entry in entries)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Reader API - provides iterator
|
// Reader API - provides iterator
|
||||||
IReader reader = ReaderFactory.Open(stream);
|
IReader reader = ReaderFactory.OpenReader(stream);
|
||||||
while (reader.MoveToNextEntry())
|
while (reader.MoveToNextEntry())
|
||||||
{
|
{
|
||||||
// Forward-only iteration - one entry at a time
|
// Forward-only iteration - one entry at a time
|
||||||
@@ -381,7 +381,7 @@ public class NewFormatArchive : AbstractArchive
|
|||||||
private NewFormatHeader _header;
|
private NewFormatHeader _header;
|
||||||
private List<NewFormatEntry> _entries;
|
private List<NewFormatEntry> _entries;
|
||||||
|
|
||||||
public static NewFormatArchive Open(Stream stream)
|
public static NewFormatArchive OpenArchive(Stream stream)
|
||||||
{
|
{
|
||||||
var archive = new NewFormatArchive();
|
var archive = new NewFormatArchive();
|
||||||
archive._header = NewFormatHeader.Read(stream);
|
archive._header = NewFormatHeader.Read(stream);
|
||||||
@@ -443,7 +443,7 @@ public class NewFormatFactory : Factory, IArchiveFactory, IReaderFactory
|
|||||||
public static NewFormatFactory Instance { get; } = new();
|
public static NewFormatFactory Instance { get; } = new();
|
||||||
|
|
||||||
public IArchive CreateArchive(Stream stream)
|
public IArchive CreateArchive(Stream stream)
|
||||||
=> NewFormatArchive.Open(stream);
|
=> NewFormatArchive.OpenArchive(stream);
|
||||||
|
|
||||||
public IReader CreateReader(Stream stream, ReaderOptions options)
|
public IReader CreateReader(Stream stream, ReaderOptions options)
|
||||||
=> new NewFormatReader(stream) { Options = options };
|
=> new NewFormatReader(stream) { Options = options };
|
||||||
@@ -481,7 +481,7 @@ public class NewFormatTests : TestBase
|
|||||||
public void NewFormat_Extracts_Successfully()
|
public void NewFormat_Extracts_Successfully()
|
||||||
{
|
{
|
||||||
var archivePath = Path.Combine(TEST_ARCHIVES_PATH, "archive.newformat");
|
var archivePath = Path.Combine(TEST_ARCHIVES_PATH, "archive.newformat");
|
||||||
using (var archive = NewFormatArchive.Open(archivePath))
|
using (var archive = NewFormatArchive.OpenArchive(archivePath))
|
||||||
{
|
{
|
||||||
archive.WriteToDirectory(SCRATCH_FILES_PATH);
|
archive.WriteToDirectory(SCRATCH_FILES_PATH);
|
||||||
// Assert extraction
|
// Assert extraction
|
||||||
@@ -561,7 +561,7 @@ public class CustomStream : Stream
|
|||||||
```csharp
|
```csharp
|
||||||
// Correct: Nested using blocks
|
// Correct: Nested using blocks
|
||||||
using (var fileStream = File.OpenRead("archive.zip"))
|
using (var fileStream = File.OpenRead("archive.zip"))
|
||||||
using (var archive = ZipArchive.Open(fileStream))
|
using (var archive = ZipArchive.OpenArchive(fileStream))
|
||||||
{
|
{
|
||||||
archive.WriteToDirectory(@"C:\output");
|
archive.WriteToDirectory(@"C:\output");
|
||||||
}
|
}
|
||||||
@@ -570,7 +570,7 @@ using (var archive = ZipArchive.Open(fileStream))
|
|||||||
// Correct: Using with options
|
// Correct: Using with options
|
||||||
var options = new ReaderOptions { LeaveStreamOpen = true };
|
var options = new ReaderOptions { LeaveStreamOpen = true };
|
||||||
var stream = File.OpenRead("archive.zip");
|
var stream = File.OpenRead("archive.zip");
|
||||||
using (var archive = ZipArchive.Open(stream, options))
|
using (var archive = ZipArchive.OpenArchive(stream, options))
|
||||||
{
|
{
|
||||||
archive.WriteToDirectory(@"C:\output");
|
archive.WriteToDirectory(@"C:\output");
|
||||||
}
|
}
|
||||||
@@ -641,7 +641,7 @@ public void Archive_Extraction_Works()
|
|||||||
var testArchive = Path.Combine(TEST_ARCHIVES_PATH, "test.zip");
|
var testArchive = Path.Combine(TEST_ARCHIVES_PATH, "test.zip");
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
using (var archive = ZipArchive.Open(testArchive))
|
using (var archive = ZipArchive.OpenArchive(testArchive))
|
||||||
{
|
{
|
||||||
archive.WriteToDirectory(SCRATCH_FILES_PATH);
|
archive.WriteToDirectory(SCRATCH_FILES_PATH);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ var options = new ReaderOptions
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
using (var archive = ZipArchive.Open("japanese.zip", options))
|
using (var archive = ZipArchive.OpenArchive("japanese.zip", options))
|
||||||
{
|
{
|
||||||
foreach (var entry in archive.Entries)
|
foreach (var entry in archive.Entries)
|
||||||
{
|
{
|
||||||
@@ -51,7 +51,7 @@ var options = new ReaderOptions
|
|||||||
{
|
{
|
||||||
ArchiveEncoding = new ArchiveEncoding { Default = Encoding.GetEncoding(932) }
|
ArchiveEncoding = new ArchiveEncoding { Default = Encoding.GetEncoding(932) }
|
||||||
};
|
};
|
||||||
using (var archive = ZipArchive.Open("file.zip", options))
|
using (var archive = ZipArchive.OpenArchive("file.zip", options))
|
||||||
{
|
{
|
||||||
// Use archive with correct encoding
|
// Use archive with correct encoding
|
||||||
}
|
}
|
||||||
@@ -64,7 +64,7 @@ var options = new ReaderOptions
|
|||||||
ArchiveEncoding = new ArchiveEncoding { Default = Encoding.GetEncoding(932) }
|
ArchiveEncoding = new ArchiveEncoding { Default = Encoding.GetEncoding(932) }
|
||||||
};
|
};
|
||||||
using (var stream = File.OpenRead("file.zip"))
|
using (var stream = File.OpenRead("file.zip"))
|
||||||
using (var reader = ReaderFactory.Open(stream, options))
|
using (var reader = ReaderFactory.OpenReader(stream, options))
|
||||||
{
|
{
|
||||||
while (reader.MoveToNextEntry())
|
while (reader.MoveToNextEntry())
|
||||||
{
|
{
|
||||||
@@ -89,7 +89,7 @@ var options = new ReaderOptions
|
|||||||
Default = Encoding.GetEncoding(932)
|
Default = Encoding.GetEncoding(932)
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
using (var archive = ZipArchive.Open("japanese.zip", options))
|
using (var archive = ZipArchive.OpenArchive("japanese.zip", options))
|
||||||
{
|
{
|
||||||
// Correctly decodes Japanese filenames
|
// Correctly decodes Japanese filenames
|
||||||
}
|
}
|
||||||
@@ -266,7 +266,7 @@ SharpCompress attempts to auto-detect encoding, but this isn't always reliable:
|
|||||||
|
|
||||||
```csharp
|
```csharp
|
||||||
// Auto-detection (default)
|
// Auto-detection (default)
|
||||||
using (var archive = ZipArchive.Open("file.zip")) // Uses UTF8 by default
|
using (var archive = ZipArchive.OpenArchive("file.zip")) // Uses UTF8 by default
|
||||||
{
|
{
|
||||||
// May show corrupted characters if archive uses different encoding
|
// May show corrupted characters if archive uses different encoding
|
||||||
}
|
}
|
||||||
@@ -276,7 +276,7 @@ var options = new ReaderOptions
|
|||||||
{
|
{
|
||||||
ArchiveEncoding = new ArchiveEncoding { Default = Encoding.GetEncoding(932) }
|
ArchiveEncoding = new ArchiveEncoding { Default = Encoding.GetEncoding(932) }
|
||||||
};
|
};
|
||||||
using (var archive = ZipArchive.Open("file.zip", options))
|
using (var archive = ZipArchive.OpenArchive("file.zip", options))
|
||||||
{
|
{
|
||||||
// Correct characters displayed
|
// Correct characters displayed
|
||||||
}
|
}
|
||||||
@@ -324,7 +324,7 @@ var options = new ReaderOptions
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
using (var archive = ZipArchive.Open("mixed.zip", options))
|
using (var archive = ZipArchive.OpenArchive("mixed.zip", options))
|
||||||
{
|
{
|
||||||
foreach (var entry in archive.Entries)
|
foreach (var entry in archive.Entries)
|
||||||
{
|
{
|
||||||
@@ -388,7 +388,7 @@ var options = new ReaderOptions
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
using (var archive = ZipArchive.Open("japanese_files.zip", options))
|
using (var archive = ZipArchive.OpenArchive("japanese_files.zip", options))
|
||||||
{
|
{
|
||||||
archive.WriteToDirectory(@"C:\output", new ExtractionOptions
|
archive.WriteToDirectory(@"C:\output", new ExtractionOptions
|
||||||
{
|
{
|
||||||
@@ -410,7 +410,7 @@ var options = new ReaderOptions
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
using (var archive = ZipArchive.Open("french_files.zip", options))
|
using (var archive = ZipArchive.OpenArchive("french_files.zip", options))
|
||||||
{
|
{
|
||||||
archive.WriteToDirectory(@"C:\output");
|
archive.WriteToDirectory(@"C:\output");
|
||||||
}
|
}
|
||||||
@@ -428,7 +428,7 @@ var options = new ReaderOptions
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
using (var archive = ZipArchive.Open("chinese_files.zip", options))
|
using (var archive = ZipArchive.OpenArchive("chinese_files.zip", options))
|
||||||
{
|
{
|
||||||
archive.WriteToDirectory(@"C:\output");
|
archive.WriteToDirectory(@"C:\output");
|
||||||
}
|
}
|
||||||
@@ -445,7 +445,7 @@ var options = new ReaderOptions
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
using (var archive = ZipArchive.Open("russian_files.zip", options))
|
using (var archive = ZipArchive.OpenArchive("russian_files.zip", options))
|
||||||
{
|
{
|
||||||
archive.WriteToDirectory(@"C:\output");
|
archive.WriteToDirectory(@"C:\output");
|
||||||
}
|
}
|
||||||
@@ -463,7 +463,7 @@ var options = new ReaderOptions
|
|||||||
};
|
};
|
||||||
|
|
||||||
using (var stream = File.OpenRead("japanese.zip"))
|
using (var stream = File.OpenRead("japanese.zip"))
|
||||||
using (var reader = ReaderFactory.Open(stream, options))
|
using (var reader = ReaderFactory.OpenReader(stream, options))
|
||||||
{
|
{
|
||||||
while (reader.MoveToNextEntry())
|
while (reader.MoveToNextEntry())
|
||||||
{
|
{
|
||||||
@@ -484,7 +484,7 @@ When creating archives, SharpCompress uses UTF8 by default (recommended):
|
|||||||
|
|
||||||
```csharp
|
```csharp
|
||||||
// Create with UTF8 (default, recommended)
|
// Create with UTF8 (default, recommended)
|
||||||
using (var archive = ZipArchive.Create())
|
using (var archive = ZipArchive.CreateArchive())
|
||||||
{
|
{
|
||||||
archive.AddAllFromDirectory(@"D:\my_files");
|
archive.AddAllFromDirectory(@"D:\my_files");
|
||||||
archive.SaveTo("output.zip", CompressionType.Deflate);
|
archive.SaveTo("output.zip", CompressionType.Deflate);
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ Choose the right API based on your use case:
|
|||||||
// - You need random access to entries
|
// - You need random access to entries
|
||||||
// - Stream is seekable (file, MemoryStream)
|
// - Stream is seekable (file, MemoryStream)
|
||||||
|
|
||||||
using (var archive = ZipArchive.Open("archive.zip"))
|
using (var archive = ZipArchive.OpenArchive("archive.zip"))
|
||||||
{
|
{
|
||||||
// Random access - all entries available
|
// Random access - all entries available
|
||||||
var specific = archive.Entries.FirstOrDefault(e => e.Key == "file.txt");
|
var specific = archive.Entries.FirstOrDefault(e => e.Key == "file.txt");
|
||||||
@@ -51,7 +51,7 @@ using (var archive = ZipArchive.Open("archive.zip"))
|
|||||||
// - Forward-only processing is acceptable
|
// - Forward-only processing is acceptable
|
||||||
|
|
||||||
using (var stream = File.OpenRead("large.zip"))
|
using (var stream = File.OpenRead("large.zip"))
|
||||||
using (var reader = ReaderFactory.Open(stream))
|
using (var reader = ReaderFactory.OpenReader(stream))
|
||||||
{
|
{
|
||||||
while (reader.MoveToNextEntry())
|
while (reader.MoveToNextEntry())
|
||||||
{
|
{
|
||||||
@@ -129,7 +129,7 @@ For processing archives from downloads or pipes:
|
|||||||
```csharp
|
```csharp
|
||||||
// Download stream (non-seekable)
|
// Download stream (non-seekable)
|
||||||
using (var httpStream = await httpClient.GetStreamAsync(url))
|
using (var httpStream = await httpClient.GetStreamAsync(url))
|
||||||
using (var reader = ReaderFactory.Open(httpStream))
|
using (var reader = ReaderFactory.OpenReader(httpStream))
|
||||||
{
|
{
|
||||||
// Process entries as they arrive
|
// Process entries as they arrive
|
||||||
while (reader.MoveToNextEntry())
|
while (reader.MoveToNextEntry())
|
||||||
@@ -159,14 +159,14 @@ Choose based on your constraints:
|
|||||||
```csharp
|
```csharp
|
||||||
// Download then extract (requires disk space)
|
// Download then extract (requires disk space)
|
||||||
var archivePath = await DownloadFile(url, @"C:\temp\archive.zip");
|
var archivePath = await DownloadFile(url, @"C:\temp\archive.zip");
|
||||||
using (var archive = ZipArchive.Open(archivePath))
|
using (var archive = ZipArchive.OpenArchive(archivePath))
|
||||||
{
|
{
|
||||||
archive.WriteToDirectory(@"C:\output");
|
archive.WriteToDirectory(@"C:\output");
|
||||||
}
|
}
|
||||||
|
|
||||||
// Stream during download (on-the-fly extraction)
|
// Stream during download (on-the-fly extraction)
|
||||||
using (var httpStream = await httpClient.GetStreamAsync(url))
|
using (var httpStream = await httpClient.GetStreamAsync(url))
|
||||||
using (var reader = ReaderFactory.Open(httpStream))
|
using (var reader = ReaderFactory.OpenReader(httpStream))
|
||||||
{
|
{
|
||||||
while (reader.MoveToNextEntry())
|
while (reader.MoveToNextEntry())
|
||||||
{
|
{
|
||||||
@@ -198,7 +198,7 @@ Extracting File3 requires decompressing File1 and File2 first.
|
|||||||
|
|
||||||
**Random Extraction (Slow):**
|
**Random Extraction (Slow):**
|
||||||
```csharp
|
```csharp
|
||||||
using (var archive = RarArchive.Open("solid.rar"))
|
using (var archive = RarArchive.OpenArchive("solid.rar"))
|
||||||
{
|
{
|
||||||
foreach (var entry in archive.Entries)
|
foreach (var entry in archive.Entries)
|
||||||
{
|
{
|
||||||
@@ -210,7 +210,7 @@ using (var archive = RarArchive.Open("solid.rar"))
|
|||||||
|
|
||||||
**Sequential Extraction (Fast):**
|
**Sequential Extraction (Fast):**
|
||||||
```csharp
|
```csharp
|
||||||
using (var archive = RarArchive.Open("solid.rar"))
|
using (var archive = RarArchive.OpenArchive("solid.rar"))
|
||||||
{
|
{
|
||||||
// Method 1: Use WriteToDirectory (recommended)
|
// Method 1: Use WriteToDirectory (recommended)
|
||||||
archive.WriteToDirectory(@"C:\output", new ExtractionOptions
|
archive.WriteToDirectory(@"C:\output", new ExtractionOptions
|
||||||
@@ -256,7 +256,7 @@ using (var archive = RarArchive.Open("solid.rar"))
|
|||||||
// Level 9 = Slowest, best compression
|
// Level 9 = Slowest, best compression
|
||||||
|
|
||||||
// Write with different compression levels
|
// Write with different compression levels
|
||||||
using (var archive = ZipArchive.Create())
|
using (var archive = ZipArchive.CreateArchive())
|
||||||
{
|
{
|
||||||
archive.AddAllFromDirectory(@"D:\data");
|
archive.AddAllFromDirectory(@"D:\data");
|
||||||
|
|
||||||
@@ -293,7 +293,7 @@ using (var archive = ZipArchive.Create())
|
|||||||
// Smaller block size = lower memory, faster
|
// Smaller block size = lower memory, faster
|
||||||
// Larger block size = better compression, slower
|
// Larger block size = better compression, slower
|
||||||
|
|
||||||
using (var archive = TarArchive.Create())
|
using (var archive = TarArchive.CreateArchive())
|
||||||
{
|
{
|
||||||
archive.AddAllFromDirectory(@"D:\data");
|
archive.AddAllFromDirectory(@"D:\data");
|
||||||
|
|
||||||
@@ -313,7 +313,7 @@ LZMA compression is very powerful but memory-intensive:
|
|||||||
// - Better compression: larger dictionary
|
// - Better compression: larger dictionary
|
||||||
|
|
||||||
// Preset via CompressionType
|
// Preset via CompressionType
|
||||||
using (var archive = TarArchive.Create())
|
using (var archive = TarArchive.CreateArchive())
|
||||||
{
|
{
|
||||||
archive.AddAllFromDirectory(@"D:\data");
|
archive.AddAllFromDirectory(@"D:\data");
|
||||||
archive.SaveTo("archive.tar.xz", CompressionType.LZMA); // Default settings
|
archive.SaveTo("archive.tar.xz", CompressionType.LZMA); // Default settings
|
||||||
@@ -333,7 +333,7 @@ Async is beneficial when:
|
|||||||
|
|
||||||
```csharp
|
```csharp
|
||||||
// Async extraction (non-blocking)
|
// Async extraction (non-blocking)
|
||||||
using (var archive = ZipArchive.Open("archive.zip"))
|
using (var archive = ZipArchive.OpenArchive("archive.zip"))
|
||||||
{
|
{
|
||||||
await archive.WriteToDirectoryAsync(
|
await archive.WriteToDirectoryAsync(
|
||||||
@"C:\output",
|
@"C:\output",
|
||||||
@@ -353,7 +353,7 @@ Async doesn't improve performance for:
|
|||||||
|
|
||||||
```csharp
|
```csharp
|
||||||
// Sync extraction (simpler, same performance on fast I/O)
|
// Sync extraction (simpler, same performance on fast I/O)
|
||||||
using (var archive = ZipArchive.Open("archive.zip"))
|
using (var archive = ZipArchive.OpenArchive("archive.zip"))
|
||||||
{
|
{
|
||||||
archive.WriteToDirectory(
|
archive.WriteToDirectory(
|
||||||
@"C:\output",
|
@"C:\output",
|
||||||
@@ -373,7 +373,7 @@ cts.CancelAfter(TimeSpan.FromMinutes(5));
|
|||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
using (var archive = ZipArchive.Open("archive.zip"))
|
using (var archive = ZipArchive.OpenArchive("archive.zip"))
|
||||||
{
|
{
|
||||||
await archive.WriteToDirectoryAsync(
|
await archive.WriteToDirectoryAsync(
|
||||||
@"C:\output",
|
@"C:\output",
|
||||||
@@ -408,14 +408,14 @@ catch (OperationCanceledException)
|
|||||||
// ✗ Slow - opens each archive separately
|
// ✗ Slow - opens each archive separately
|
||||||
foreach (var file in files)
|
foreach (var file in files)
|
||||||
{
|
{
|
||||||
using (var archive = ZipArchive.Open("archive.zip"))
|
using (var archive = ZipArchive.OpenArchive("archive.zip"))
|
||||||
{
|
{
|
||||||
archive.WriteToDirectory(@"C:\output");
|
archive.WriteToDirectory(@"C:\output");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// ✓ Better - process multiple entries at once
|
// ✓ Better - process multiple entries at once
|
||||||
using (var archive = ZipArchive.Open("archive.zip"))
|
using (var archive = ZipArchive.OpenArchive("archive.zip"))
|
||||||
{
|
{
|
||||||
archive.WriteToDirectory(@"C:\output");
|
archive.WriteToDirectory(@"C:\output");
|
||||||
}
|
}
|
||||||
@@ -425,7 +425,7 @@ using (var archive = ZipArchive.Open("archive.zip"))
|
|||||||
|
|
||||||
```csharp
|
```csharp
|
||||||
var sw = Stopwatch.StartNew();
|
var sw = Stopwatch.StartNew();
|
||||||
using (var archive = ZipArchive.Open("large.zip"))
|
using (var archive = ZipArchive.OpenArchive("large.zip"))
|
||||||
{
|
{
|
||||||
archive.WriteToDirectory(@"C:\output");
|
archive.WriteToDirectory(@"C:\output");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -90,7 +90,7 @@ Note: Extracting a solid rar or 7z file needs to be done in sequential order to
|
|||||||
`ExtractAllEntries` is primarily intended for solid archives (like solid Rar) or 7Zip archives, where sequential extraction provides the best performance. For general/simple extraction with any supported archive type, use `archive.WriteToDirectory()` instead.
|
`ExtractAllEntries` is primarily intended for solid archives (like solid Rar) or 7Zip archives, where sequential extraction provides the best performance. For general/simple extraction with any supported archive type, use `archive.WriteToDirectory()` instead.
|
||||||
|
|
||||||
```C#
|
```C#
|
||||||
using (var archive = RarArchive.Open("Test.rar"))
|
using (var archive = RarArchive.OpenArchive("Test.rar"))
|
||||||
{
|
{
|
||||||
// Simple extraction with RarArchive; this WriteToDirectory pattern works for all archive types
|
// Simple extraction with RarArchive; this WriteToDirectory pattern works for all archive types
|
||||||
archive.WriteToDirectory(@"D:\temp", new ExtractionOptions()
|
archive.WriteToDirectory(@"D:\temp", new ExtractionOptions()
|
||||||
@@ -104,7 +104,7 @@ using (var archive = RarArchive.Open("Test.rar"))
|
|||||||
### Iterate over all files from a Rar file using RarArchive
|
### Iterate over all files from a Rar file using RarArchive
|
||||||
|
|
||||||
```C#
|
```C#
|
||||||
using (var archive = RarArchive.Open("Test.rar"))
|
using (var archive = RarArchive.OpenArchive("Test.rar"))
|
||||||
{
|
{
|
||||||
foreach (var entry in archive.Entries.Where(entry => !entry.IsDirectory))
|
foreach (var entry in archive.Entries.Where(entry => !entry.IsDirectory))
|
||||||
{
|
{
|
||||||
@@ -126,7 +126,7 @@ var progress = new Progress<ProgressReport>(report =>
|
|||||||
Console.WriteLine($"Extracting {report.EntryPath}: {report.PercentComplete}%");
|
Console.WriteLine($"Extracting {report.EntryPath}: {report.PercentComplete}%");
|
||||||
});
|
});
|
||||||
|
|
||||||
using (var archive = RarArchive.Open("archive.rar", new ReaderOptions { Progress = progress })) // Must be solid Rar or 7Zip
|
using (var archive = RarArchive.OpenArchive("archive.rar", new ReaderOptions { Progress = progress })) // Must be solid Rar or 7Zip
|
||||||
{
|
{
|
||||||
archive.WriteToDirectory(@"D:\output", new ExtractionOptions()
|
archive.WriteToDirectory(@"D:\output", new ExtractionOptions()
|
||||||
{
|
{
|
||||||
@@ -140,7 +140,7 @@ using (var archive = RarArchive.Open("archive.rar", new ReaderOptions { Progress
|
|||||||
|
|
||||||
```C#
|
```C#
|
||||||
using (Stream stream = File.OpenRead("Tar.tar.bz2"))
|
using (Stream stream = File.OpenRead("Tar.tar.bz2"))
|
||||||
using (var reader = ReaderFactory.Open(stream))
|
using (var reader = ReaderFactory.OpenReader(stream))
|
||||||
{
|
{
|
||||||
while (reader.MoveToNextEntry())
|
while (reader.MoveToNextEntry())
|
||||||
{
|
{
|
||||||
@@ -161,7 +161,7 @@ using (var reader = ReaderFactory.Open(stream))
|
|||||||
|
|
||||||
```C#
|
```C#
|
||||||
using (Stream stream = File.OpenRead("Tar.tar.bz2"))
|
using (Stream stream = File.OpenRead("Tar.tar.bz2"))
|
||||||
using (var reader = ReaderFactory.Open(stream))
|
using (var reader = ReaderFactory.OpenReader(stream))
|
||||||
{
|
{
|
||||||
while (reader.MoveToNextEntry())
|
while (reader.MoveToNextEntry())
|
||||||
{
|
{
|
||||||
@@ -180,7 +180,7 @@ using (var reader = ReaderFactory.Open(stream))
|
|||||||
|
|
||||||
```C#
|
```C#
|
||||||
using (Stream stream = File.OpenWrite("C:\\temp.tgz"))
|
using (Stream stream = File.OpenWrite("C:\\temp.tgz"))
|
||||||
using (var writer = WriterFactory.Open(stream, ArchiveType.Tar, new WriterOptions(CompressionType.GZip)
|
using (var writer = WriterFactory.OpenWriter(stream, ArchiveType.Tar, new WriterOptions(CompressionType.GZip)
|
||||||
{
|
{
|
||||||
LeaveOpenStream = true
|
LeaveOpenStream = true
|
||||||
}))
|
}))
|
||||||
@@ -199,7 +199,7 @@ opts.ArchiveEncoding.CustomDecoder = (data, x, y) =>
|
|||||||
{
|
{
|
||||||
return encoding.GetString(data);
|
return encoding.GetString(data);
|
||||||
};
|
};
|
||||||
var tr = SharpCompress.Archives.Zip.ZipArchive.Open("test.zip", opts);
|
var tr = SharpCompress.Archives.Zip.ZipArchive.OpenArchive("test.zip", opts);
|
||||||
foreach(var entry in tr.Entries)
|
foreach(var entry in tr.Entries)
|
||||||
{
|
{
|
||||||
Console.WriteLine($"{entry.Key}");
|
Console.WriteLine($"{entry.Key}");
|
||||||
@@ -213,7 +213,7 @@ foreach(var entry in tr.Entries)
|
|||||||
**Extract single entry asynchronously:**
|
**Extract single entry asynchronously:**
|
||||||
```C#
|
```C#
|
||||||
using (Stream stream = File.OpenRead("archive.zip"))
|
using (Stream stream = File.OpenRead("archive.zip"))
|
||||||
using (var reader = ReaderFactory.Open(stream))
|
using (var reader = ReaderFactory.OpenReader(stream))
|
||||||
{
|
{
|
||||||
while (reader.MoveToNextEntry())
|
while (reader.MoveToNextEntry())
|
||||||
{
|
{
|
||||||
@@ -234,7 +234,7 @@ using (var reader = ReaderFactory.Open(stream))
|
|||||||
**Extract all entries asynchronously:**
|
**Extract all entries asynchronously:**
|
||||||
```C#
|
```C#
|
||||||
using (Stream stream = File.OpenRead("archive.tar.gz"))
|
using (Stream stream = File.OpenRead("archive.tar.gz"))
|
||||||
using (var reader = ReaderFactory.Open(stream))
|
using (var reader = ReaderFactory.OpenReader(stream))
|
||||||
{
|
{
|
||||||
await reader.WriteAllToDirectoryAsync(
|
await reader.WriteAllToDirectoryAsync(
|
||||||
@"D:\temp",
|
@"D:\temp",
|
||||||
@@ -250,7 +250,7 @@ using (var reader = ReaderFactory.Open(stream))
|
|||||||
|
|
||||||
**Open and process entry stream asynchronously:**
|
**Open and process entry stream asynchronously:**
|
||||||
```C#
|
```C#
|
||||||
using (var archive = ZipArchive.Open("archive.zip"))
|
using (var archive = ZipArchive.OpenArchive("archive.zip"))
|
||||||
{
|
{
|
||||||
foreach (var entry in archive.Entries.Where(e => !e.IsDirectory))
|
foreach (var entry in archive.Entries.Where(e => !e.IsDirectory))
|
||||||
{
|
{
|
||||||
@@ -268,7 +268,7 @@ using (var archive = ZipArchive.Open("archive.zip"))
|
|||||||
**Write single file asynchronously:**
|
**Write single file asynchronously:**
|
||||||
```C#
|
```C#
|
||||||
using (Stream archiveStream = File.OpenWrite("output.zip"))
|
using (Stream archiveStream = File.OpenWrite("output.zip"))
|
||||||
using (var writer = WriterFactory.Open(archiveStream, ArchiveType.Zip, CompressionType.Deflate))
|
using (var writer = WriterFactory.OpenWriter(archiveStream, ArchiveType.Zip, CompressionType.Deflate))
|
||||||
{
|
{
|
||||||
using (Stream fileStream = File.OpenRead("input.txt"))
|
using (Stream fileStream = File.OpenRead("input.txt"))
|
||||||
{
|
{
|
||||||
@@ -280,7 +280,7 @@ using (var writer = WriterFactory.Open(archiveStream, ArchiveType.Zip, Compressi
|
|||||||
**Write entire directory asynchronously:**
|
**Write entire directory asynchronously:**
|
||||||
```C#
|
```C#
|
||||||
using (Stream stream = File.OpenWrite("backup.tar.gz"))
|
using (Stream stream = File.OpenWrite("backup.tar.gz"))
|
||||||
using (var writer = WriterFactory.Open(stream, ArchiveType.Tar, new WriterOptions(CompressionType.GZip)))
|
using (var writer = WriterFactory.OpenWriter(stream, ArchiveType.Tar, new WriterOptions(CompressionType.GZip)))
|
||||||
{
|
{
|
||||||
await writer.WriteAllAsync(
|
await writer.WriteAllAsync(
|
||||||
@"D:\files",
|
@"D:\files",
|
||||||
@@ -299,7 +299,7 @@ var cts = new CancellationTokenSource();
|
|||||||
cts.CancelAfter(TimeSpan.FromMinutes(5));
|
cts.CancelAfter(TimeSpan.FromMinutes(5));
|
||||||
|
|
||||||
using (Stream stream = File.OpenWrite("archive.zip"))
|
using (Stream stream = File.OpenWrite("archive.zip"))
|
||||||
using (var writer = WriterFactory.Open(stream, ArchiveType.Zip, CompressionType.Deflate))
|
using (var writer = WriterFactory.OpenWriter(stream, ArchiveType.Zip, CompressionType.Deflate))
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
@@ -316,7 +316,7 @@ using (var writer = WriterFactory.Open(stream, ArchiveType.Zip, CompressionType.
|
|||||||
|
|
||||||
**Extract from archive asynchronously:**
|
**Extract from archive asynchronously:**
|
||||||
```C#
|
```C#
|
||||||
using (var archive = ZipArchive.Open("archive.zip"))
|
using (var archive = ZipArchive.OpenArchive("archive.zip"))
|
||||||
{
|
{
|
||||||
// Simple async extraction - works for all archive types
|
// Simple async extraction - works for all archive types
|
||||||
await archive.WriteToDirectoryAsync(
|
await archive.WriteToDirectoryAsync(
|
||||||
|
|||||||
Reference in New Issue
Block a user