У меня есть функция, которую я использую для агрегирования потоков из zip-архива.Почтовый индекс в zip открывается недокументированному System.IO.Compression.SubReadStream
private void ExtractMiscellaneousFiles()
{
foreach (var miscellaneousFileName in _fileData.MiscellaneousFileNames)
{
var fileEntry = _archive.GetEntry(miscellaneousFileName);
if (fileEntry == null)
{
throw new ZipArchiveMissingFileException("Couldn't find " + miscellaneousFileName);
}
var stream = fileEntry.Open();
OtherFileStreams.Add(miscellaneousFileName, (DeflateStream) stream);
}
}
В большинстве случаев это хорошо работает. Тем не менее, если у меня есть почтовый индекс в пределах почтового индекса, я получаю excpetion на отливку потока в DeflateStream
:
System.InvalidCastException: Невозможно привести объект типа «System.IO.Compression.SubReadStream» к типу 'System.IO.Compression.DeflateStream.
Я не могу найти документацию Microsoft для SubReadStream
. Я хотел бы, чтобы мой почтовый индекс находился в zip как DeflateStream
. Это возможно? Если да, то как?
UPDATE
Еще нет успеха. Я попытался @ предложение Sunshine вы копирования потока, используя следующий код:
private void ExtractMiscellaneousFiles()
{
_logger.Log("Extracting misc files...");
foreach (var miscellaneousFileName in _fileData.MiscellaneousFileNames)
{
_logger.Log($"Opening misc file stream for {miscellaneousFileName}");
var fileEntry = _archive.GetEntry(miscellaneousFileName);
if (fileEntry == null)
{
throw new ZipArchiveMissingFileException("Couldn't find " + miscellaneousFileName);
}
var openStream = fileEntry.Open();
var deflateStream = openStream;
if (!(deflateStream is DeflateStream))
{
var memoryStream = new MemoryStream();
deflateStream.CopyTo(memoryStream);
memoryStream.Position = 0;
deflateStream = new DeflateStream(memoryStream, CompressionLevel.NoCompression, true);
}
OtherFileStreams.Add(miscellaneousFileName, (DeflateStream)deflateStream);
}
}
Но я получаю
System.NotSupportedException: Поток не поддерживает чтение.
Я осмотрел deflateStream.CanRead
и это правда.
Я обнаружил, что это происходит не только на почтовых индексах, но и на файлах, находящихся в zip-файле, но не сжатых (например, слишком малых). Конечно, есть способ справиться с этим; наверняка кто-то сталкивался с этим раньше. Я открываю щедрость по этому вопросу.
Вот .NET source для SubReadStream
, благодаря @Quantic.
Что такое '_archive'? – Quantic
'System.IO.Compression.ZipArchive'. Благодарю. –
Должен быть .NET Core: https://github.com/dotnet/corefx/blob/bffef76f6af208e2042a2f27bc081ee908bb390b/src/System.IO.Compression/src/System/IO/Compression/ZipCustomStreams.cs – Quantic