--- /dev/null
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+namespace System.IO
+{
+ public class WrappedStream : Stream
+ {
+ private readonly Stream _baseStream;
+ private readonly EventHandler _onClosed;
+ private bool _canRead, _canWrite, _canSeek;
+
+ public WrappedStream(Stream baseStream, bool canRead, bool canWrite, bool canSeek, EventHandler onClosed = null)
+ {
+ _baseStream = baseStream;
+ _onClosed = onClosed;
+ _canRead = canRead;
+ _canSeek = canSeek;
+ _canWrite = canWrite;
+ }
+
+ public override void Flush() => _baseStream.Flush();
+
+ public override int Read(byte[] buffer, int offset, int count)
+ {
+ if (CanRead)
+ {
+ try
+ {
+ return _baseStream.Read(buffer, offset, count);
+ }
+ catch (ObjectDisposedException ex)
+ {
+ throw new InvalidOperationException("This stream does not support reading", ex);
+ }
+ }
+ else throw new InvalidOperationException("This stream does not support reading");
+ }
+
+ public override long Seek(long offset, SeekOrigin origin)
+ {
+ if (CanSeek)
+ {
+ try
+ {
+ return _baseStream.Seek(offset, origin);
+ }
+ catch (ObjectDisposedException ex)
+ {
+ throw new InvalidOperationException("This stream does not support seeking", ex);
+ }
+ }
+ else throw new InvalidOperationException("This stream does not support seeking");
+ }
+
+ public override void SetLength(long value) { _baseStream.SetLength(value); }
+
+ public override void Write(byte[] buffer, int offset, int count)
+ {
+ if (CanWrite)
+ {
+ try
+ {
+ _baseStream.Write(buffer, offset, count);
+ }
+ catch (ObjectDisposedException ex)
+ {
+ throw new InvalidOperationException("This stream does not support writing", ex);
+ }
+ }
+ else throw new InvalidOperationException("This stream does not support writing");
+ }
+
+ public override bool CanRead => _canRead && _baseStream.CanRead;
+
+ public override bool CanSeek => _canSeek && _baseStream.CanSeek;
+
+ public override bool CanWrite => _canWrite && _baseStream.CanWrite;
+
+ public override long Length
+ {
+ get
+ {
+ if (!CanSeek)
+ {
+ throw new InvalidOperationException("This stream does not support seeking.");
+ }
+ return _baseStream.Length;
+ }
+ }
+
+ public override long Position
+ {
+ get
+ {
+ if (!CanSeek)
+ {
+ throw new InvalidOperationException("This stream does not support seeking");
+ }
+ return _baseStream.Position;
+ }
+ set
+ {
+ if (CanSeek)
+ {
+ try
+ {
+ _baseStream.Position = value;
+ }
+ catch (ObjectDisposedException ex)
+ {
+ throw new InvalidOperationException("This stream does not support seeking", ex);
+ }
+ }
+ else throw new InvalidOperationException("This stream does not support seeking");
+ }
+ }
+
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing)
+ {
+ _onClosed?.Invoke(this, null);
+ _canRead = false;
+ _canWrite = false;
+ _canSeek = false;
+ }
+ base.Dispose(disposing);
+ }
+ }
+}
\ No newline at end of file
{
_isDisposed = true;
- if (!_leaveOpen && _dataStreamsToDispose?.Count > 0)
+ if (!_leaveOpen)
{
- foreach (Stream s in _dataStreamsToDispose)
+ await _archiveStream.DisposeAsync().ConfigureAwait(false);
+
+ if (_dataStreamsToDispose?.Count > 0)
{
- await s.DisposeAsync().ConfigureAwait(false);
+ foreach (Stream s in _dataStreamsToDispose)
+ {
+ await s.DisposeAsync().ConfigureAwait(false);
+ }
}
}
}
<Compile Include="TarWriter\TarWriter.WriteEntry.Tests.cs" />
<Compile Include="TarWriter\TarWriter.WriteEntry.Entry.Ustar.Tests.cs" />
<Compile Include="TarWriter\TarWriter.WriteEntry.Entry.V7.Tests.cs" />
- <Compile Include="WrappedStream.cs" Link="WrappedStream.cs" />
<Compile Include="$(CommonPath)DisableRuntimeMarshalling.cs" Link="Common\DisableRuntimeMarshalling.cs" />
<Compile Include="$(CommonTestPath)System\IO\ReparsePointUtilities.cs" Link="Common\System\IO\ReparsePointUtilities.cs" />
+ <Compile Include="$(CommonTestPath)System\IO\WrappedStream.cs" Link="Common\System\IO\WrappedStream.cs" />
<Compile Include="$(CommonTestPath)TestUtilities\System\DisableParallelization.cs" Link="Common\TestUtilities\System\DisableParallelization.cs" />
</ItemGroup>
<!-- Windows specific files -->
public void WriteEntry_LongFileSize(TarEntryFormat entryFormat, long size, bool unseekableStream)
{
// Write archive with a 8 Gb long entry.
- FileStream tarFile = File.Open(GetTestFilePath(), new FileStreamOptions { Access = FileAccess.ReadWrite, Mode = FileMode.Create, Options = FileOptions.DeleteOnClose });
+ using FileStream tarFile = File.Open(GetTestFilePath(), new FileStreamOptions { Access = FileAccess.ReadWrite, Mode = FileMode.Create, Options = FileOptions.DeleteOnClose });
Stream s = unseekableStream ? new WrappedStream(tarFile, tarFile.CanRead, tarFile.CanWrite, canSeek: false) : tarFile;
using (TarWriter writer = new(s, leaveOpen: true))
public async Task WriteEntry_LongFileSizeAsync(TarEntryFormat entryFormat, long size, bool unseekableStream)
{
// Write archive with a 8 Gb long entry.
- FileStream tarFile = File.Open(GetTestFilePath(), new FileStreamOptions { Access = FileAccess.ReadWrite, Mode = FileMode.Create, Options = FileOptions.DeleteOnClose });
+ await using FileStream tarFile = File.Open(GetTestFilePath(), new FileStreamOptions { Access = FileAccess.ReadWrite, Mode = FileMode.Create, Options = FileOptions.DeleteOnClose });
Stream s = unseekableStream ? new WrappedStream(tarFile, tarFile.CanRead, tarFile.CanWrite, canSeek: false) : tarFile;
await using (TarWriter writer = new(s, leaveOpen: true))
+++ /dev/null
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-
-using System.IO;
-
-namespace System.Formats.Tar
-{
- public class WrappedStream : Stream
- {
- private readonly Stream _baseStream;
- private readonly EventHandler _onClosed;
- private bool _canRead, _canWrite, _canSeek;
-
- public WrappedStream(Stream baseStream, bool canRead, bool canWrite, bool canSeek, EventHandler onClosed = null)
- {
- _baseStream = baseStream;
- _onClosed = onClosed;
- _canRead = canRead;
- _canSeek = canSeek;
- _canWrite = canWrite;
- }
-
- public override void Flush() => _baseStream.Flush();
-
- public override int Read(byte[] buffer, int offset, int count)
- {
- if (CanRead)
- {
- try
- {
- return _baseStream.Read(buffer, offset, count);
- }
- catch (ObjectDisposedException ex)
- {
- throw new InvalidOperationException("This stream does not support reading", ex);
- }
- }
- else throw new InvalidOperationException("This stream does not support reading");
- }
-
- public override long Seek(long offset, SeekOrigin origin)
- {
- if (CanSeek)
- {
- try
- {
- return _baseStream.Seek(offset, origin);
- }
- catch (ObjectDisposedException ex)
- {
- throw new InvalidOperationException("This stream does not support seeking", ex);
- }
- }
- else throw new InvalidOperationException("This stream does not support seeking");
- }
-
- public override void SetLength(long value) { _baseStream.SetLength(value); }
-
- public override void Write(byte[] buffer, int offset, int count)
- {
- if (CanWrite)
- {
- try
- {
- _baseStream.Write(buffer, offset, count);
- }
- catch (ObjectDisposedException ex)
- {
- throw new InvalidOperationException("This stream does not support writing", ex);
- }
- }
- else throw new InvalidOperationException("This stream does not support writing");
- }
-
- public override bool CanRead => _canRead && _baseStream.CanRead;
-
- public override bool CanSeek => _canSeek && _baseStream.CanSeek;
-
- public override bool CanWrite => _canWrite && _baseStream.CanWrite;
-
- public override long Length
- {
- get
- {
- if (!CanSeek)
- {
- throw new InvalidOperationException("This stream does not support seeking.");
- }
- return _baseStream.Length;
- }
- }
-
- public override long Position
- {
- get
- {
- if (!CanSeek)
- {
- throw new InvalidOperationException("This stream does not support seeking");
- }
- return _baseStream.Position;
- }
- set
- {
- if (CanSeek)
- {
- try
- {
- _baseStream.Position = value;
- }
- catch (ObjectDisposedException ex)
- {
- throw new InvalidOperationException("This stream does not support seeking", ex);
- }
- }
- else throw new InvalidOperationException("This stream does not support seeking");
- }
- }
-
- protected override void Dispose(bool disposing)
- {
- if (disposing)
- {
- _onClosed?.Invoke(this, null);
- _canRead = false;
- _canWrite = false;
- _canSeek = false;
- }
- base.Dispose(disposing);
- }
- }
-}
\ No newline at end of file
<Compile Include="CompressionStreamUnitTests.Deflate.cs" />
<Compile Include="CompressionStreamUnitTests.Gzip.cs" />
<Compile Include="Utilities\StripHeaderAndFooter.cs" />
- <Compile Include="Utilities\WrappedStream.cs" />
<Compile Include="XunitAssemblyAttributes.cs" />
<Compile Include="ZipArchive\zip_CreateTests.cs" />
<Compile Include="ZipArchive\zip_CreateTests.Comments.cs" />
<Compile Include="$(CommonTestPath)System\IO\Compression\LocalMemoryStream.cs" Link="Common\System\IO\Compression\LocalMemoryStream.cs" />
<Compile Include="$(CommonTestPath)System\IO\Compression\StreamHelpers.cs" Link="Common\System\IO\Compression\StreamHelpers.cs" />
<Compile Include="$(CommonTestPath)System\IO\TempFile.cs" Link="Common\System\IO\TempFile.cs" />
+ <Compile Include="$(CommonTestPath)System\IO\WrappedStream.cs" Link="Common\System\IO\WrappedStream.cs" />
<Compile Include="$(CommonTestPath)System\IO\Compression\ZipTestHelper.cs" Link="Common\System\IO\Compression\ZipTestHelper.cs" />
<Compile Include="$(CommonTestPath)TestUtilities\System\DisableParallelization.cs" Link="Common\TestUtilities\System\DisableParallelization.cs" />
<Compile Include="$(CommonPath)System\Threading\Tasks\TaskToApm.cs" Link="Common\System\Threading\Tasks\TaskToApm.cs" />
+++ /dev/null
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-
-using System;
-using System.IO;
-
-internal class WrappedStream : Stream
-{
- private readonly Stream _baseStream;
- private readonly EventHandler _onClosed;
- private bool _canRead, _canWrite, _canSeek;
-
- internal WrappedStream(Stream baseStream, bool canRead, bool canWrite, bool canSeek, EventHandler onClosed)
- {
- _baseStream = baseStream;
- _onClosed = onClosed;
- _canRead = canRead;
- _canSeek = canSeek;
- _canWrite = canWrite;
- }
-
- internal WrappedStream(Stream baseStream, EventHandler onClosed)
- : this(baseStream, true, true, true, onClosed) { }
-
- internal WrappedStream(Stream baseStream) : this(baseStream, null) { }
-
- public override void Flush() => _baseStream.Flush();
-
- public override int Read(byte[] buffer, int offset, int count)
- {
- if (CanRead)
- {
- try
- {
- return _baseStream.Read(buffer, offset, count);
- }
- catch (ObjectDisposedException ex)
- {
- throw new NotSupportedException("This stream does not support reading", ex);
- }
- }
- else throw new NotSupportedException("This stream does not support reading");
- }
-
- public override long Seek(long offset, SeekOrigin origin)
- {
- if (CanSeek)
- {
- try
- {
- return _baseStream.Seek(offset, origin);
- }
- catch (ObjectDisposedException ex)
- {
- throw new NotSupportedException("This stream does not support seeking", ex);
- }
- }
- else throw new NotSupportedException("This stream does not support seeking");
- }
-
- public override void SetLength(long value) { _baseStream.SetLength(value); }
-
- public override void Write(byte[] buffer, int offset, int count)
- {
- if (CanWrite)
- {
- try
- {
- _baseStream.Write(buffer, offset, count);
- }
- catch (ObjectDisposedException ex)
- {
- throw new NotSupportedException("This stream does not support writing", ex);
- }
- }
- else throw new NotSupportedException("This stream does not support writing");
- }
-
- public override bool CanRead => _canRead && _baseStream.CanRead;
-
- public override bool CanSeek => _canSeek && _baseStream.CanSeek;
-
- public override bool CanWrite => _canWrite && _baseStream.CanWrite;
-
- public override long Length => _baseStream.Length;
-
- public override long Position
- {
- get
- {
- if (CanSeek)
- return _baseStream.Position;
- throw new NotSupportedException("This stream does not support seeking");
- }
- set
- {
- if (CanSeek)
- {
- try
- {
- _baseStream.Position = value;
- }
- catch (ObjectDisposedException ex)
- {
- throw new NotSupportedException("This stream does not support seeking", ex);
- }
- }
- else throw new NotSupportedException("This stream does not support seeking");
- }
- }
-
- protected override void Dispose(bool disposing)
- {
- if (disposing)
- {
- _onClosed?.Invoke(this, null);
- _canRead = false;
- _canWrite = false;
- _canSeek = false;
- }
- base.Dispose(disposing);
- }
-}