Skip to content

System.IO.Compression.ZipFile.CreateFromDirectory: overloads to write to a stream rather than a file #1555

Closed
@halgab

Description

@halgab

Rationale and usage

The ZipFile.CreateFromDirectory signatures all assume that we want to write the resulting file directly to the file system. But for small archives that are directly uploaded to cloud storage, this is not very efficient.

Symmetrically, ZipFile.ExtractToDirectory overloads that take a zip stream rather than a file would be convenient to unzip cloud archives directly onto a drive.

Proposed API

Zipping

namespace System.IO.Compression;
public static class ZipFile
{
+   public static void CreateFromDirectory(string sourceDirectoryName, Stream destination)
+   public static void CreateFromDirectory(string sourceDirectoryName, Stream destination, CompressionLevel compressionLevel, bool includeBaseDirectory)
+   public static void CreateFromDirectory(string sourceDirectoryName, Stream destination, CompressionLevel compressionLevel, bool includeBaseDirectory, Encoding? entryNameEncoding)
    public static void CreateFromDirectory(string sourceDirectoryName, string destinationArchiveFileName)
    public static void CreateFromDirectory(string sourceDirectoryName, string destinationArchiveFileName, CompressionLevel compressionLevel, bool includeBaseDirectory)
    public static void CreateFromDirectory(string sourceDirectoryName, string destinationArchiveFileName, CompressionLevel compressionLevel, bool includeBaseDirectory, Encoding? entryNameEncoding)
}

Unzipping

namespace System.IO.Compression;
public static class ZipFile
{
+   public static void ExtractToDirectory(Stream source, string destinationDirectoryName) { }
+   public static void ExtractToDirectory(Stream source, string destinationDirectoryName, bool overwriteFiles) { }
+   public static void ExtractToDirectory(Stream source, string destinationDirectoryName, Encoding? entryNameEncoding) { }
+   public static void ExtractToDirectory(Stream source, string destinationDirectoryName, Encoding? entryNameEncoding, bool overwriteFiles) { }
    public static void ExtractToDirectory(string sourceArchiveFileName, string destinationDirectoryName) { }
    public static void ExtractToDirectory(string sourceArchiveFileName, string destinationDirectoryName, bool overwriteFiles) { }
    public static void ExtractToDirectory(string sourceArchiveFileName, string destinationDirectoryName, Encoding? entryNameEncoding) { }
    public static void ExtractToDirectory(string sourceArchiveFileName, string destinationDirectoryName, Encoding? entryNameEncoding, bool overwriteFiles)
}

There is a discussion below to also add overloads to ZipFile.Open that take a stream instead of a string, but there doesn't seem to be much value on adding those because the user can simply use new ZipArchive(Stream, ZipArchiveMode).

These APIs are analogous to the ones we already added in System.Formats.Tar.TarFile.

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions