rarvolumeinstream.cpp

来自「由7-zip提供的压缩、解压缩程序」· C++ 代码 · 共 80 行

CPP
80
字号
// RarVolumeInStream.cpp#include "StdAfx.h"#include "RarVolumeInStream.h"#include "Windows/Defs.h"#include "Common/Defs.h"namespace NArchive {namespace NRar {void CFolderInStream::Init(    CObjectVector<CInArchive> *archives,     const CObjectVector<CItemEx> *items,    const CRefItem &refItem){  _archives = archives;  _items = items;  _refItem = refItem;  _curIndex = 0;  CRCs.Clear();  _fileIsOpen = false;}HRESULT CFolderInStream::OpenStream(){  while (_curIndex < _refItem.NumItems)  {    const CItemEx &item = (*_items)[_refItem.ItemIndex + _curIndex];    _stream.Attach((*_archives)[_refItem.VolumeIndex + _curIndex].        CreateLimitedStream(item.GetDataPosition(), item.PackSize));    _curIndex++;    _fileIsOpen = true;    _crc.Init();    return S_OK;  }  return S_OK;}HRESULT CFolderInStream::CloseStream(){  CRCs.Add(_crc.GetDigest());  _stream.Release();  _fileIsOpen = false;  return S_OK;}STDMETHODIMP CFolderInStream::Read(void *data, UInt32 size, UInt32 *processedSize){  UInt32 realProcessedSize = 0;  while ((_curIndex < _refItem.NumItems || _fileIsOpen) && size > 0)  {    if (_fileIsOpen)    {      UInt32 localProcessedSize;      RINOK(_stream->Read(          ((Byte *)data) + realProcessedSize, size, &localProcessedSize));      _crc.Update(((Byte *)data) + realProcessedSize, localProcessedSize);      if (localProcessedSize == 0)      {        RINOK(CloseStream());        continue;      }      realProcessedSize += localProcessedSize;      size -= localProcessedSize;      break;    }    else    {      RINOK(OpenStream());    }  }  if (processedSize != 0)    *processedSize = realProcessedSize;  return S_OK;}}}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?