7zproperties.cpp

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

CPP
167
字号
// 7zProperties.cpp#include "StdAfx.h"#include "7zProperties.h"#include "7zHeader.h"#include "7zHandler.h"// #define _MULTI_PACKnamespace NArchive {namespace N7z {struct CPropMap{  UInt64 FilePropID;  STATPROPSTG StatPROPSTG;};CPropMap kPropMap[] = {  { NID::kName, NULL, kpidPath, VT_BSTR},  { NID::kSize, NULL, kpidSize, VT_UI8},  { NID::kPackInfo, NULL, kpidPackedSize, VT_UI8},    #ifdef _MULTI_PACK  { 100, L"Pack0", kpidPackedSize0, VT_UI8},  { 101, L"Pack1", kpidPackedSize1, VT_UI8},  { 102, L"Pack2", kpidPackedSize2, VT_UI8},  { 103, L"Pack3", kpidPackedSize3, VT_UI8},  { 104, L"Pack4", kpidPackedSize4, VT_UI8},  #endif  { NID::kCreationTime, NULL, kpidCreationTime, VT_FILETIME},  { NID::kLastWriteTime, NULL, kpidLastWriteTime, VT_FILETIME},  { NID::kLastAccessTime, NULL, kpidLastAccessTime, VT_FILETIME},  { NID::kWinAttributes, NULL, kpidAttributes, VT_UI4},  { NID::kStartPos, NULL, kpidPosition, VT_UI4},  { NID::kCRC, NULL, kpidCRC, VT_UI4},    { NID::kAnti, L"Anti", kpidIsAnti, VT_BOOL},  // { 97, NULL, kpidSolid, VT_BOOL},  #ifndef _SFX  { 98, NULL, kpidMethod, VT_BSTR},  { 99, L"Block", kpidBlock, VT_UI4}  #endif  // { L"ID", kpidID, VT_BSTR},  // { L"UnPack Version", kpidUnPackVersion, VT_UI1},  // { L"Host OS", kpidHostOS, VT_BSTR}};static const int kPropMapSize = sizeof(kPropMap) / sizeof(kPropMap[0]);static int FindPropInMap(UInt64 filePropID){  for (int i = 0; i < kPropMapSize; i++)    if (kPropMap[i].FilePropID == filePropID)      return i;  return -1;}static void CopyOneItem(CRecordVector<UInt64> &src,     CRecordVector<UInt64> &dest, UInt32 item){  for (int i = 0; i < src.Size(); i++)    if (src[i] == item)    {      dest.Add(item);      src.Delete(i);      return;    }}static void RemoveOneItem(CRecordVector<UInt64> &src, UInt32 item){  for (int i = 0; i < src.Size(); i++)    if (src[i] == item)    {      src.Delete(i);      return;    }}static void InsertToHead(CRecordVector<UInt64> &dest, UInt32 item){  for (int i = 0; i < dest.Size(); i++)    if (dest[i] == item)    {      dest.Delete(i);      break;    }  dest.Insert(0, item);}void CHandler::FillPopIDs(){   _fileInfoPopIDs.Clear();  #ifdef _7Z_VOL  if(_volumes.Size() < 1)    return;  const CVolume &volume = _volumes.Front();  const CArchiveDatabaseEx &_database = volume.Database;  #endif  CRecordVector<UInt64> fileInfoPopIDs = _database.ArchiveInfo.FileInfoPopIDs;  RemoveOneItem(fileInfoPopIDs, NID::kEmptyStream);  RemoveOneItem(fileInfoPopIDs, NID::kEmptyFile);  CopyOneItem(fileInfoPopIDs, _fileInfoPopIDs, NID::kName);  CopyOneItem(fileInfoPopIDs, _fileInfoPopIDs, NID::kAnti);  CopyOneItem(fileInfoPopIDs, _fileInfoPopIDs, NID::kSize);  CopyOneItem(fileInfoPopIDs, _fileInfoPopIDs, NID::kPackInfo);  CopyOneItem(fileInfoPopIDs, _fileInfoPopIDs, NID::kCreationTime);  CopyOneItem(fileInfoPopIDs, _fileInfoPopIDs, NID::kLastWriteTime);  CopyOneItem(fileInfoPopIDs, _fileInfoPopIDs, NID::kLastAccessTime);  CopyOneItem(fileInfoPopIDs, _fileInfoPopIDs, NID::kWinAttributes);  CopyOneItem(fileInfoPopIDs, _fileInfoPopIDs, NID::kCRC);  CopyOneItem(fileInfoPopIDs, _fileInfoPopIDs, NID::kComment);  _fileInfoPopIDs += fileInfoPopIDs;    #ifndef _SFX  _fileInfoPopIDs.Add(98);  _fileInfoPopIDs.Add(99);  #endif  #ifdef _MULTI_PACK  _fileInfoPopIDs.Add(100);  _fileInfoPopIDs.Add(101);  _fileInfoPopIDs.Add(102);  _fileInfoPopIDs.Add(103);  _fileInfoPopIDs.Add(104);  #endif  #ifndef _SFX  InsertToHead(_fileInfoPopIDs, NID::kLastWriteTime);  InsertToHead(_fileInfoPopIDs, NID::kPackInfo);  InsertToHead(_fileInfoPopIDs, NID::kSize);  InsertToHead(_fileInfoPopIDs, NID::kName);  #endif}STDMETHODIMP CHandler::GetNumberOfProperties(UInt32 *numProperties){  *numProperties = _fileInfoPopIDs.Size();  return S_OK;}STDMETHODIMP CHandler::GetPropertyInfo(UInt32 index,           BSTR *name, PROPID *propID, VARTYPE *varType){  if((int)index >= _fileInfoPopIDs.Size())    return E_INVALIDARG;  int indexInMap = FindPropInMap(_fileInfoPopIDs[index]);  if (indexInMap == -1)    return E_INVALIDARG;  const STATPROPSTG &srcItem = kPropMap[indexInMap].StatPROPSTG;  *propID = srcItem.propid;  *varType = srcItem.vt;  *name = 0;  return S_OK;}}}

⌨️ 快捷键说明

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