Skip to content

Conversation

@iremyux
Copy link
Contributor

@iremyux iremyux commented Nov 28, 2025

When a ZipArchive is opened in ZipArchiveMode.Update, calling ZipArchiveEntry.Open() always returns a read-write stream by invoking OpenInUpdateMode(). This causes the entire entry to be decompressed into memory, even when the caller only intends to read the entry's contents.
This PR adds a new Open(FileAccess access) overload to ZipArchiveEntry that allows callers to explicitly specify the desired access mode:

FileAccess.Read: Opens the entry in read mode OpenInReadMode, avoiding the memory overhead of decompression into a MemoryStream. This is useful when you only need to read the entry's contents in Update mode.
FileAccess.Write: Opens the entry in write mode OpenInWriteMode.
FileAccess.ReadWrite: Opens the entry in update mode OpenInUpdateMode, matching the current parameterless Open() behavior.

The method validates that the requested access is compatible with the archive's mode:

In Read mode: Only FileAccess.Read is allowed
In Create mode: Only FileAccess.Write or FileAccess.ReadWrite is allowed
In Update mode: All access modes are allowed. FileAccess.Read returns a read-only stream, while FileAccess.Write and FileAccess.ReadWrite both return a read-write-seekable stream. (FileAccess.Write and FileAccess.ReadWrite behave identically)

Fixes #101243

@dotnet-policy-service
Copy link
Contributor

Tagging subscribers to this area: @dotnet/area-system-io-compression
See info in area-owners.md if you want to be subscribed.

@iremyux iremyux marked this pull request as ready for review November 28, 2025 11:26
Copilot AI review requested due to automatic review settings November 28, 2025 11:26
Copilot finished reviewing on behalf of iremyux November 28, 2025 11:30
Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR adds a new Open(FileAccess access) overload to ZipArchiveEntry that allows callers to explicitly specify the desired file access mode when opening an entry. This is particularly valuable in ZipArchiveMode.Update, where the existing parameterless Open() always returns a read-write stream by decompressing the entire entry into memory. The new overload allows specifying FileAccess.Read to avoid this memory overhead when only reading is needed.

Key Changes:

  • New Open(FileAccess access) method validates that the requested access is compatible with the archive's mode and calls the appropriate internal open method (OpenInReadMode, OpenInWriteMode, or OpenInUpdateMode)
  • Three new error message resources for incompatible access modes
  • Comprehensive test coverage for all combinations of archive modes and access types

Reviewed changes

Copilot reviewed 4 out of 4 changed files in this pull request and generated 4 comments.

File Description
src/libraries/System.IO.Compression/src/System/IO/Compression/ZipArchiveEntry.cs Implements the new Open(FileAccess access) overload with validation logic for different archive modes
src/libraries/System.IO.Compression/ref/System.IO.Compression.cs Adds the new public API surface to the reference assembly
src/libraries/System.IO.Compression/src/Resources/Strings.resx Adds three new error message resources for invalid access scenarios
src/libraries/System.IO.Compression/tests/ZipArchive/zip_InvalidParametersAndStrangeFiles.cs Adds 11 new test methods covering all valid and invalid access combinations for each archive mode

@iremyux iremyux requested a review from Copilot November 28, 2025 16:02
Copilot finished reviewing on behalf of iremyux November 28, 2025 16:06
Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 4 out of 4 changed files in this pull request and generated 1 comment.

@iremyux iremyux requested a review from Copilot November 28, 2025 19:42
Copilot finished reviewing on behalf of iremyux November 28, 2025 19:45
Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 4 out of 4 changed files in this pull request and generated 3 comments.

Comments suppressed due to low confidence (1)

src/libraries/System.IO.Compression/tests/ZipArchive/zip_InvalidParametersAndStrangeFiles.cs:2256

  • The comment states that ReadWrite "opens in write mode" but based on the implementation (line 392 in ZipArchiveEntry.cs), it actually calls OpenInWriteMode() which may return a stream with different capabilities than implied. The comment should clarify what capabilities the returned stream actually has. Consider: "// ReadWrite is allowed in Create mode and calls OpenInWriteMode()"
            // ReadWrite should be allowed in Create mode (it opens in write mode)

/// <summary>
/// Opens the entry with the specified access mode. This allows for more granular control over the returned stream's capabilities.
/// </summary>
/// <param name="access">The desired file access mode for the returned stream.</param>
Copy link

Copilot AI Nov 28, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The <param> description should be a noun phrase that begins with an introductory article, per the documentation guidelines. Consider: "The file access mode for the returned stream."

Copilot uses AI. Check for mistakes.
/// Opens the entry with the specified access mode. This allows for more granular control over the returned stream's capabilities.
/// </summary>
/// <param name="access">The desired file access mode for the returned stream.</param>
/// <returns>A Stream that represents the contents of the entry with the specified access capabilities.</returns>
Copy link

Copilot AI Nov 28, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The <returns> description should be a noun phrase that begins with an introductory article. Consider: "A stream that represents the contents of the entry with the specified access capabilities."

Suggested change
/// <returns>A Stream that represents the contents of the entry with the specified access capabilities.</returns>
/// <returns>A <see cref="Stream"/> that represents the contents of the entry with the specified access capabilities.</returns>

Copilot uses AI. Check for mistakes.
Comment on lines +2257 to +2258
using Stream stream = entry.Open(FileAccess.ReadWrite);
Assert.True(stream.CanWrite);
Copy link

Copilot AI Nov 28, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In Create mode with FileAccess.ReadWrite, the test verifies stream.CanWrite but doesn't verify stream.CanRead like the corresponding Update mode test does (line 2324-2326). For consistency and completeness, consider adding an assertion for stream.CanRead to match the behavior documented in the comment on line 2256.

Copilot uses AI. Check for mistakes.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[API Proposal]: Add ZipArchiveEntry.Open overload

1 participant