7zfolderinstream.cpp

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

CPP
129
字号
// 7zFolderInStream.cpp#include "StdAfx.h"#include "7zFolderInStream.h"namespace NArchive {namespace N7z {CFolderInStream::CFolderInStream(){  _inStreamWithHashSpec = new CSequentialInStreamWithCRC;  _inStreamWithHash = _inStreamWithHashSpec;}void CFolderInStream::Init(IArchiveUpdateCallback *updateCallback,     const UInt32 *fileIndices, UInt32 numFiles){  _updateCallback = updateCallback;  _numFiles = numFiles;  _fileIndex = 0;  _fileIndices = fileIndices;  Processed.Clear();  CRCs.Clear();  Sizes.Clear();  _fileIsOpen = false;  _currentSizeIsDefined = false;}HRESULT CFolderInStream::OpenStream(){  _filePos = 0;  while (_fileIndex < _numFiles)  {    _currentSizeIsDefined = false;    CMyComPtr<ISequentialInStream> stream;    HRESULT result = _updateCallback->GetStream(_fileIndices[_fileIndex], &stream);    if (result != S_OK && result != S_FALSE)      return result;    _fileIndex++;    _inStreamWithHashSpec->Init(stream);    if (!stream)    {      RINOK(_updateCallback->SetOperationResult(NArchive::NUpdate::NOperationResult::kOK));      Sizes.Add(0);      Processed.Add(result == S_OK);      AddDigest();      continue;    }    CMyComPtr<IStreamGetSize> streamGetSize;    if (stream.QueryInterface(IID_IStreamGetSize, &streamGetSize) == S_OK)    {      if(streamGetSize)      {        _currentSizeIsDefined = true;        RINOK(streamGetSize->GetSize(&_currentSize));      }    }    _fileIsOpen = true;    return S_OK;  }  return S_OK;}void CFolderInStream::AddDigest(){  CRCs.Add(_inStreamWithHashSpec->GetCRC());}HRESULT CFolderInStream::CloseStream(){  RINOK(_updateCallback->SetOperationResult(NArchive::NUpdate::NOperationResult::kOK));  _inStreamWithHashSpec->ReleaseStream();  _fileIsOpen = false;  Processed.Add(true);  Sizes.Add(_filePos);  AddDigest();  return S_OK;}STDMETHODIMP CFolderInStream::Read(void *data, UInt32 size, UInt32 *processedSize){  UInt32 realProcessedSize = 0;  while ((_fileIndex < _numFiles || _fileIsOpen) && size > 0)  {    if (_fileIsOpen)    {      UInt32 localProcessedSize;      RINOK(_inStreamWithHash->Read(          ((Byte *)data) + realProcessedSize, size, &localProcessedSize));      if (localProcessedSize == 0)      {        RINOK(CloseStream());        continue;      }      realProcessedSize += localProcessedSize;      _filePos += localProcessedSize;      size -= localProcessedSize;      break;    }    else    {      RINOK(OpenStream());    }  }  if (processedSize != 0)    *processedSize = realProcessedSize;  return S_OK;}STDMETHODIMP CFolderInStream::GetSubStreamSize(UInt64 subStream, UInt64 *value){  *value = 0;  if (subStream < Sizes.Size())  {    *value= Sizes[(int)(size_t)subStream];    return S_OK;  }  if (subStream > Sizes.Size())    return E_FAIL;  if (!_currentSizeIsDefined)    return S_FALSE;  *value = _currentSize;  return S_OK;}}}

⌨️ 快捷键说明

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