⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 list.cpp

📁 source code for unrar3.3.4,uppack the .rar files,for multi-os
💻 CPP
字号:
#include "rar.hpp"static void ListFileHeader(FileHeader &hd,bool Verbose,bool Technical,bool &TitleShown,bool Bare);static void ListSymLink(Archive &Arc);static void ListFileAttr(uint A,int HostOS);static void ListOldSubHeader(Archive &Arc);static void ListNewSubHeader(CommandData *Cmd,Archive &Arc,bool Technical);void ListArchive(CommandData *Cmd){  Int64 SumPackSize=0,SumUnpSize=0;  uint ArcCount=0,SumFileCount=0;  bool Technical=(Cmd->Command[1]=='T');  bool Bare=(Cmd->Command[1]=='B');  bool Verbose=(*Cmd->Command=='V');  char ArcName[NM];  wchar ArcNameW[NM];  while (Cmd->GetArcName(ArcName,ArcNameW,sizeof(ArcName)))  {    Archive Arc(Cmd);    if (!Arc.WOpen(ArcName,ArcNameW))      continue;    bool FileMatched=true;    while (1)    {      Int64 TotalPackSize=0,TotalUnpSize=0;      uint FileCount=0;      if (Arc.IsArchive(true))      {        bool TitleShown=false;        if (!Bare)        {          Arc.ViewComment();          mprintf("\n");          if (Arc.Solid)            mprintf(St(MListSolid));          if (Arc.SFXSize>0)            mprintf(St(MListSFX));          if (Arc.Volume)            if (Arc.Solid)              mprintf(St(MListVol1));            else              mprintf(St(MListVol2));          else            if (Arc.Solid)              mprintf(St(MListArc1));            else              mprintf(St(MListArc2));          mprintf(" %s\n",Arc.FileName);          if (Technical)          {            if (Arc.Protected)              mprintf(St(MListRecRec));            if (Arc.Locked)              mprintf(St(MListLock));          }        }        while(Arc.ReadHeader()>0)        {          switch(Arc.GetHeaderType())          {            case FILE_HEAD:              IntToExt(Arc.NewLhd.FileName,Arc.NewLhd.FileName);              if ((FileMatched=Cmd->IsProcessFile(Arc.NewLhd))==true)              {                ListFileHeader(Arc.NewLhd,Verbose,Technical,TitleShown,Bare);                if (!(Arc.NewLhd.Flags & LHD_SPLIT_BEFORE))                {                  TotalUnpSize+=Arc.NewLhd.FullUnpSize;                  FileCount++;                }                TotalPackSize+=Arc.NewLhd.FullPackSize;                if (Technical)                  ListSymLink(Arc);              }              break;#ifndef SFX_MODULE            case SUB_HEAD:              if (Technical && FileMatched && !Bare)                ListOldSubHeader(Arc);              break;#endif            case NEWSUB_HEAD:              if (FileMatched && !Bare)              {                if (Technical)                  ListFileHeader(Arc.SubHead,Verbose,true,TitleShown,false);                ListNewSubHeader(Cmd,Arc,Technical);              }              break;          }          Arc.SeekToNext();        }        if (!Bare)          if (TitleShown)          {            mprintf("\n");            for (int I=0;I<79;I++)              mprintf("-");            char UnpSizeText[20];            itoa(TotalUnpSize,UnpSizeText);                    char PackSizeText[20];            itoa(TotalPackSize,PackSizeText);                    mprintf("\n%5lu %16s %8s %3d%%\n",FileCount,UnpSizeText,                    PackSizeText,ToPercent(TotalPackSize,TotalUnpSize));            SumFileCount+=FileCount;            SumUnpSize+=TotalUnpSize;            SumPackSize+=TotalPackSize;          }          else            mprintf(St(MListNoFiles));        ArcCount++;#ifndef NOVOLUME        if (Cmd->VolSize!=0 && ((Arc.NewLhd.Flags & LHD_SPLIT_AFTER) ||            Arc.GetHeaderType()==ENDARC_HEAD &&            (Arc.EndArcHead.Flags & EARC_NEXT_VOLUME)!=0) &&            MergeArchive(Arc,NULL,false,*Cmd->Command))        {          Arc.Seek(0,SEEK_SET);        }        else#endif          break;      }      else      {        if (Cmd->ArcNames->ItemsCount()<2 && !Bare)          mprintf(St(MNotRAR),Arc.FileName);        break;      }    }  }  if (ArcCount>1 && !Bare)  {    char UnpSizeText[20],PackSizeText[20];    itoa(SumUnpSize,UnpSizeText);    itoa(SumPackSize,PackSizeText);    mprintf("\n%5lu %16s %8s %3d%%\n",SumFileCount,UnpSizeText,            PackSizeText,ToPercent(SumPackSize,SumUnpSize));  }}void ListFileHeader(FileHeader &hd,bool Verbose,bool Technical,bool &TitleShown,bool Bare){  if (!Bare)  {    if (!TitleShown)    {      if (Verbose)        mprintf(St(MListPathComm));      else        mprintf(St(MListName));      mprintf(St(MListTitle));      if (Technical)        mprintf(St(MListTechTitle));      for (int I=0;I<79;I++)        mprintf("-");      TitleShown=true;    }    if (hd.HeadType==NEWSUB_HEAD)      mprintf(St(MSubHeadType),hd.FileName);    mprintf("\n%c",(hd.Flags & LHD_PASSWORD) ? '*' : ' ');  }  char *Name=hd.FileName;#ifdef UNICODE_SUPPORTED  char ConvertedName[NM];  if ((hd.Flags & LHD_UNICODE)!=0 && *hd.FileNameW!=0)  {    WideToChar(hd.FileNameW,ConvertedName);    Name=ConvertedName;  }#endif  if (Bare)  {    mprintf("%s\n",Verbose ? Name:PointToName(Name));    return;  }  if (Verbose)    mprintf("%s\n%12s ",Name,"");  else    mprintf("%-12s",PointToName(Name));  char UnpSizeText[20],PackSizeText[20];  itoa(hd.FullUnpSize,UnpSizeText);  itoa(hd.FullPackSize,PackSizeText);  mprintf(" %8s %8s ",UnpSizeText,PackSizeText);  if ((hd.Flags & LHD_SPLIT_BEFORE) && (hd.Flags & LHD_SPLIT_AFTER))    mprintf(" <->");  else    if (hd.Flags & LHD_SPLIT_BEFORE)      mprintf(" <--");    else      if (hd.Flags & LHD_SPLIT_AFTER)        mprintf(" -->");      else        mprintf("%3d%%",ToPercent(hd.FullPackSize,hd.FullUnpSize));  char DateStr[50];  hd.mtime.GetText(DateStr,false);  mprintf(" %s ",DateStr);  if (hd.HeadType==NEWSUB_HEAD)    mprintf("  %c....B  ",(hd.SubFlags & SUBHEAD_FLAGS_INHERITED) ? 'I' : '.');  else    ListFileAttr(hd.FileAttr,hd.HostOS);  mprintf(" %8.8lX",hd.FileCRC);  mprintf(" m%d",hd.Method-0x30);  if ((hd.Flags & LHD_WINDOWMASK)<=6*32)    mprintf("%c",((hd.Flags&LHD_WINDOWMASK)>>5)+'a');  else    mprintf(" ");  mprintf(" %d.%d",hd.UnpVer/10,hd.UnpVer%10);  static char *RarOS[]={    "DOS","OS/2","Win95/NT","Unix","MacOS","BeOS","WinCE","","",""  };  if (Technical)    mprintf("\n%22s %8s %4s",RarOS[hd.HostOS],            (hd.Flags & LHD_SOLID) ? St(MYes):St(MNo),            (hd.Flags & LHD_VERSION) ? St(MYes):St(MNo));}void ListSymLink(Archive &Arc){  if (Arc.NewLhd.HostOS==HOST_UNIX && (Arc.NewLhd.FileAttr & 0xF000)==0xA000)  {    char FileName[NM];    int DataSize=Min(Arc.NewLhd.PackSize,sizeof(FileName)-1);    Arc.Read(FileName,DataSize);    FileName[DataSize]=0;    mprintf("\n%22s %s","-->",FileName);  }}void ListFileAttr(uint A,int HostOS){  switch(HostOS)  {    case HOST_MSDOS:    case HOST_OS2:    case HOST_WIN32:    case HOST_MACOS:      mprintf("  %c%c%c%c%c%c  ",              (A & 0x08) ? 'V' : '.',              (A & 0x10) ? 'D' : '.',              (A & 0x01) ? 'R' : '.',              (A & 0x02) ? 'H' : '.',              (A & 0x04) ? 'S' : '.',              (A & 0x20) ? 'A' : '.');      break;    case HOST_UNIX:    case HOST_BEOS:      switch (A & 0xF000)      {        case 0x4000:          mprintf("d");          break;        case 0xA000:          mprintf("l");          break;        default:          mprintf("-");          break;      }      mprintf("%c%c%c%c%c%c%c%c%c",              (A & 0x0100) ? 'r' : '-',              (A & 0x0080) ? 'w' : '-',              (A & 0x0040) ? ((A & 0x0800) ? 's':'x'):((A & 0x0800) ? 'S':'-'),              (A & 0x0020) ? 'r' : '-',              (A & 0x0010) ? 'w' : '-',              (A & 0x0008) ? ((A & 0x0400) ? 's':'x'):((A & 0x0400) ? 'S':'-'),              (A & 0x0004) ? 'r' : '-',              (A & 0x0002) ? 'w' : '-',              (A & 0x0001) ? 'x' : '-');      break;  }}#ifndef SFX_MODULEvoid ListOldSubHeader(Archive &Arc){  switch(Arc.SubBlockHead.SubType)  {    case EA_HEAD:      mprintf(St(MListEAHead));      break;    case UO_HEAD:      mprintf(St(MListUOHead),Arc.UOHead.OwnerName,Arc.UOHead.GroupName);      break;    case MAC_HEAD:      mprintf(St(MListMACHead1),Arc.MACHead.fileType>>24,Arc.MACHead.fileType>>16,Arc.MACHead.fileType>>8,Arc.MACHead.fileType);      mprintf(St(MListMACHead2),Arc.MACHead.fileCreator>>24,Arc.MACHead.fileCreator>>16,Arc.MACHead.fileCreator>>8,Arc.MACHead.fileCreator);      break;    case BEEA_HEAD:      mprintf(St(MListBeEAHead));      break;    case NTACL_HEAD:      mprintf(St(MListNTACLHead));      break;    case STREAM_HEAD:      mprintf(St(MListStrmHead),Arc.StreamHead.StreamName);      break;    default:      mprintf(St(MListUnkHead),Arc.SubBlockHead.SubType);      break;  }}#endifvoid ListNewSubHeader(CommandData *Cmd,Archive &Arc,bool Technical){  if (Arc.SubHead.CmpName(SUBHEAD_TYPE_CMT) &&      (Arc.SubHead.Flags & LHD_SPLIT_BEFORE)==0 && !Cmd->DisableComment)  {    Array<byte> CmtData;    int ReadSize=Arc.ReadCommentData(CmtData);    if (ReadSize!=0)    {      mprintf(St(MFileComment));      OutComment((char *)&CmtData[0],ReadSize);    }  }  if (Arc.SubHead.CmpName(SUBHEAD_TYPE_STREAM) &&      (Arc.SubHead.Flags & LHD_SPLIT_BEFORE)==0)  {    int DestSize=Arc.SubHead.SubData.Size()/2;    wchar DestNameW[NM];    char DestName[NM];    if (DestSize<sizeof(DestName))    {      RawToWide(&Arc.SubHead.SubData[0],DestNameW,DestSize);      DestNameW[DestSize]=0;      WideToChar(DestNameW,DestName);      mprintf("\n %s",DestName);    }  }}

⌨️ 快捷键说明

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