mirror of
https://github.com/adamhathcock/sharpcompress.git
synced 2026-11-15 17:02:03 +00:00
use arraypool
This commit is contained in:
@@ -1,4 +1,5 @@
|
||||
using System;
|
||||
using System.Buffers;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
@@ -66,9 +67,25 @@ public abstract class RarVolume : Volume
|
||||
var fh = (FileHeader)header;
|
||||
if (fh.FileName == "CMT")
|
||||
{
|
||||
var buffer = new byte[fh.CompressedSize];
|
||||
fh.PackedStream.NotNull().ReadFully(buffer);
|
||||
Comment = Encoding.UTF8.GetString(buffer, 0, buffer.Length - 1);
|
||||
var commentSize = checked((int)fh.CompressedSize);
|
||||
var buffer = ArrayPool<byte>.Shared.Rent(commentSize);
|
||||
try
|
||||
{
|
||||
// Pooled buffers can be larger than the comment payload.
|
||||
if (
|
||||
!fh
|
||||
.PackedStream.NotNull()
|
||||
.ReadFully(buffer.AsSpan(0, commentSize))
|
||||
)
|
||||
{
|
||||
throw new EndOfStreamException();
|
||||
}
|
||||
Comment = Encoding.UTF8.GetString(buffer, 0, commentSize - 1);
|
||||
}
|
||||
finally
|
||||
{
|
||||
ArrayPool<byte>.Shared.Return(buffer);
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
@@ -115,12 +132,26 @@ public abstract class RarVolume : Volume
|
||||
var fh = (FileHeader)header;
|
||||
if (fh.FileName == "CMT")
|
||||
{
|
||||
var buffer = new byte[fh.CompressedSize];
|
||||
await fh
|
||||
.PackedStream.NotNull()
|
||||
.ReadFullyAsync(buffer, cancellationToken)
|
||||
.ConfigureAwait(false);
|
||||
Comment = Encoding.UTF8.GetString(buffer, 0, buffer.Length - 1);
|
||||
var commentSize = checked((int)fh.CompressedSize);
|
||||
var buffer = ArrayPool<byte>.Shared.Rent(commentSize);
|
||||
try
|
||||
{
|
||||
// Pooled buffers can be larger than the comment payload.
|
||||
if (
|
||||
!await fh
|
||||
.PackedStream.NotNull()
|
||||
.ReadFullyAsync(buffer, 0, commentSize, cancellationToken)
|
||||
.ConfigureAwait(false)
|
||||
)
|
||||
{
|
||||
throw new EndOfStreamException();
|
||||
}
|
||||
Comment = Encoding.UTF8.GetString(buffer, 0, commentSize - 1);
|
||||
}
|
||||
finally
|
||||
{
|
||||
ArrayPool<byte>.Shared.Return(buffer);
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
@@ -1,9 +1,11 @@
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using SharpCompress.Archives;
|
||||
using SharpCompress.Archives.Rar;
|
||||
using SharpCompress.Common;
|
||||
using SharpCompress.Common.Rar;
|
||||
using SharpCompress.Compressors.LZMA.Utilities;
|
||||
using SharpCompress.Readers;
|
||||
using SharpCompress.Test.Mocks;
|
||||
@@ -13,6 +15,25 @@ namespace SharpCompress.Test.Rar;
|
||||
|
||||
public class RarArchiveAsyncTests : ArchiveTests
|
||||
{
|
||||
[Fact]
|
||||
public async ValueTask Rar5_Comment_Archive_Async()
|
||||
{
|
||||
await using var archive = await RarArchive.OpenAsyncArchive(
|
||||
Path.Combine(TEST_ARCHIVES_PATH, "Rar5.comment.rar"),
|
||||
cancellationToken: CancellationToken.None
|
||||
);
|
||||
var entryCount = 0;
|
||||
await foreach (var entry in archive.EntriesAsync.WithCancellation(CancellationToken.None))
|
||||
{
|
||||
entryCount++;
|
||||
}
|
||||
Assert.True(entryCount > 0);
|
||||
await foreach (var volume in archive.VolumesAsync.WithCancellation(CancellationToken.None))
|
||||
{
|
||||
Assert.Equal("This is another comment\n", ((RarVolume)volume).Comment);
|
||||
}
|
||||
}
|
||||
|
||||
[Theory]
|
||||
[InlineData("Rar15.rar")]
|
||||
[InlineData("Rar2.rar")]
|
||||
|
||||
@@ -4,6 +4,7 @@ using System.Linq;
|
||||
using SharpCompress.Archives;
|
||||
using SharpCompress.Archives.Rar;
|
||||
using SharpCompress.Common;
|
||||
using SharpCompress.Common.Rar;
|
||||
using SharpCompress.Compressors.LZMA.Utilities;
|
||||
using SharpCompress.Readers;
|
||||
using SharpCompress.Test.Mocks;
|
||||
@@ -13,6 +14,16 @@ namespace SharpCompress.Test.Rar;
|
||||
|
||||
public class RarArchiveTests : ArchiveTests
|
||||
{
|
||||
[Fact]
|
||||
public void Rar5_Comment_Archive()
|
||||
{
|
||||
using var archive = RarArchive.OpenArchive(
|
||||
Path.Combine(TEST_ARCHIVES_PATH, "Rar5.comment.rar")
|
||||
);
|
||||
Assert.NotEmpty(archive.Entries);
|
||||
Assert.Equal("This is another comment\n", ((RarVolume)archive.Volumes.First()).Comment);
|
||||
}
|
||||
|
||||
[Theory]
|
||||
[InlineData("Rar15.rar")]
|
||||
[InlineData("Rar2.rar")]
|
||||
|
||||
Reference in New Issue
Block a user