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

📄 extract.cpp

📁 source code for unrar3.3.4,uppack the .rar files,for multi-os
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#endif    char *ExtrName=ArcFileName;#ifndef SFX_MODULE    int Length=strlen(Cmd->ArcPath);    if (Length>0 && strnicomp(Cmd->ArcPath,ArcFileName,Length)==0)    {      ExtrName+=Length;      while (*ExtrName==CPATHDIVIDER)        ExtrName++;    }#endif    if (Command=='E' || Cmd->ExclPath==EXCL_SKIPWHOLEPATH)      strcat(DestFileName,PointToName(ExtrName));    else      strcat(DestFileName,ExtrName);#ifndef SFX_MODULE    if (!WideName && *Cmd->ExtrPathW!=0)    {      DestNameW=DestFileNameW;      WideName=true;      CharToWide(ArcFileName,ArcFileNameW);    }#endif    if (WideName)    {      if (*Cmd->ExtrPathW!=0)        strcpyw(DestFileNameW,Cmd->ExtrPathW);      else        CharToWide(Cmd->ExtrPath,DestFileNameW);#ifndef SFX_MODULE      if (Cmd->AppendArcNameToPath)      {        wchar FileNameW[NM];        if (*Arc.FileNameW!=0)          strcpyw(FileNameW,Arc.FileNameW);        else          CharToWide(Arc.FileName,FileNameW);        strcatw(DestFileNameW,PointToName(FileNameW));        SetExt(DestFileNameW,NULL);        AddEndSlash(DestFileNameW);      }#endif      wchar *ExtrNameW=ArcFileNameW;#ifndef SFX_MODULE      if (Length>0)      {        wchar ArcPathW[NM];        CharToWide(Cmd->ArcPath,ArcPathW);        Length=strlenw(ArcPathW);      }      ExtrNameW+=Length;      while (*ExtrNameW==CPATHDIVIDER)        ExtrNameW++;#endif      if (Command=='E' || Cmd->ExclPath==EXCL_SKIPWHOLEPATH)        strcatw(DestFileNameW,PointToName(ExtrNameW));      else        strcatw(DestFileNameW,ExtrNameW);    }    else      *DestFileNameW=0;    ExtrFile=!SkipSolid/* && *ExtrName*/;    if ((Cmd->FreshFiles || Cmd->UpdateFiles) && (Command=='E' || Command=='X'))    {      struct FindData FD;      if (FindFile::FastFind(DestFileName,DestNameW,&FD))      {        if (FD.mtime >= Arc.NewLhd.mtime)          ExtrFile=false;      }      else        if (Cmd->FreshFiles)          ExtrFile=false;    }#ifdef RARDLL    if (*Cmd->DllDestName)    {      strncpy(DestFileName,Cmd->DllDestName,sizeof(DestFileName));      *DestFileNameW=0;      if (Cmd->DllOpMode!=RAR_EXTRACT)        ExtrFile=false;    }    if (*Cmd->DllDestNameW)    {      strncpyw(DestFileNameW,Cmd->DllDestNameW,sizeof(DestFileNameW)/sizeof(DestFileNameW[0]));      DestNameW=DestFileNameW;      if (Cmd->DllOpMode!=RAR_EXTRACT)        ExtrFile=false;    }#endif#ifdef SFX_MODULE    if (Arc.NewLhd.UnpVer!=UNP_VER && Arc.NewLhd.Method!=0x30)#else    if (Arc.NewLhd.UnpVer<13 || Arc.NewLhd.UnpVer>UNP_VER)#endif    {#ifndef SILENT      Log(Arc.FileName,St(MUnknownMeth),ArcFileName);#ifndef SFX_MODULE      Log(Arc.FileName,St(MVerRequired),Arc.NewLhd.UnpVer/10,Arc.NewLhd.UnpVer%10);#endif#endif      ExtrFile=false;      ErrHandler.SetErrorCode(WARNING);#ifdef RARDLL      Cmd->DllError=ERAR_UNKNOWN_FORMAT;#endif    }    File CurFile;    if (!IsLink(Arc.NewLhd.FileAttr))      if (Arc.IsArcDir())      {        if (!ExtrFile || Command=='P' || Command=='E' || Cmd->ExclPath==EXCL_SKIPWHOLEPATH)          return(true);        if (SkipSolid)        {#ifndef GUI          mprintf(St(MExtrSkipFile),ArcFileName);#endif          return(true);        }        TotalFileCount++;        if (Cmd->Test)        {#ifndef GUI          mprintf(St(MExtrTestFile),ArcFileName);          mprintf(" %s",St(MOk));#endif          return(true);        }        MKDIR_CODE MDCode=MakeDir(DestFileName,DestNameW,Arc.NewLhd.FileAttr);        bool DirExist=false;        if (MDCode!=MKDIR_SUCCESS)        {          DirExist=FileExist(DestFileName,DestNameW);          if (DirExist && !IsDir(GetFileAttr(DestFileName,DestNameW)))          {            bool UserReject;            FileCreate(Cmd,NULL,DestFileName,DestNameW,Cmd->Overwrite,&UserReject,Arc.NewLhd.UnpSize,Arc.NewLhd.FileTime);            DirExist=false;          }          CreatePath(DestFileName,DestNameW,true);          MDCode=MakeDir(DestFileName,DestNameW,Arc.NewLhd.FileAttr);        }        if (MDCode==MKDIR_SUCCESS)        {#ifndef GUI          mprintf(St(MCreatDir),DestFileName);          mprintf(" %s",St(MOk));#endif          PrevExtracted=true;        }        else          if (DirExist)          {            SetFileAttr(DestFileName,DestNameW,Arc.NewLhd.FileAttr);            PrevExtracted=true;          }          else          {            Log(Arc.FileName,St(MExtrErrMkDir),DestFileName);            ErrHandler.SysErrMsg();#ifdef RARDLL            Cmd->DllError=ERAR_ECREATE;#endif            ErrHandler.SetErrorCode(CREATE_ERROR);          }        if (PrevExtracted)          SetDirTime(DestFileName,            Cmd->xmtime==EXTTIME_NONE ? NULL:&Arc.NewLhd.mtime,            Cmd->xctime==EXTTIME_NONE ? NULL:&Arc.NewLhd.ctime,            Cmd->xatime==EXTTIME_NONE ? NULL:&Arc.NewLhd.atime);        return(true);      }      else      {        if (Cmd->Test && ExtrFile)          TestMode=true;#if !defined(GUI) && !defined(SFX_MODULE)        if (Command=='P' && ExtrFile)          CurFile.SetHandleType(FILE_HANDLESTD);#endif        if ((Command=='E' || Command=='X') && ExtrFile && !Cmd->Test)        {          bool UserReject;          if (!FileCreate(Cmd,&CurFile,DestFileName,DestNameW,Cmd->Overwrite,&UserReject,Arc.NewLhd.UnpSize,Arc.NewLhd.FileTime))          {            ExtrFile=false;            if (!UserReject)            {              ErrHandler.CreateErrorMsg(Arc.FileName,DestFileName);              ErrHandler.SetErrorCode(CREATE_ERROR);#ifdef RARDLL              Cmd->DllError=ERAR_ECREATE;#endif              if (!IsNameUsable(DestFileName))              {                Log(Arc.FileName,St(MCorrectingName));                MakeNameUsable(DestFileName,true);                CreatePath(DestFileName,NULL,true);                if (FileCreate(Cmd,&CurFile,DestFileName,NULL,Cmd->Overwrite,&UserReject,Arc.NewLhd.FullUnpSize,Arc.NewLhd.FileTime))                  ExtrFile=true;                else                  ErrHandler.CreateErrorMsg(Arc.FileName,DestFileName);              }            }          }        }      }    if (!ExtrFile && Arc.Solid)    {      SkipSolid=true;      TestMode=true;      ExtrFile=true;    }    if (ExtrFile)    {      if (!SkipSolid)      {        if (!TestMode && Command!='P' && CurFile.IsDevice())        {          Log(Arc.FileName,St(MInvalidName),DestFileName);          ErrHandler.WriteError(Arc.FileName,DestFileName);        }        TotalFileCount++;      }      FileCount++;#ifndef GUI      if (Command!='I')        if (SkipSolid)          mprintf(St(MExtrSkipFile),ArcFileName);        else          switch(Cmd->Test ? 'T':Command)          {            case 'T':              mprintf(St(MExtrTestFile),ArcFileName);              break;#ifndef SFX_MODULE            case 'P':              mprintf(St(MExtrPrinting),ArcFileName);              break;#endif            case 'X':            case 'E':              mprintf(St(MExtrFile),DestFileName);              break;          }      if (!Cmd->DisablePercentage)        mprintf("     ");#endif      DataIO.CurUnpRead=0;      DataIO.CurUnpWrite=0;      DataIO.UnpFileCRC=Arc.OldFormat ? 0 : 0xffffffff;      DataIO.PackedCRC=0xffffffff;      DataIO.SetEncryption(        (Arc.NewLhd.Flags & LHD_PASSWORD) ? Arc.NewLhd.UnpVer:0,Password,        (Arc.NewLhd.Flags & LHD_SALT) ? Arc.NewLhd.Salt:NULL,false);      DataIO.SetPackedSizeToRead(Arc.NewLhd.FullPackSize);      DataIO.SetFiles(&Arc,&CurFile);      DataIO.SetTestMode(TestMode);      DataIO.SetSkipUnpCRC(SkipSolid);#ifndef _WIN_CE      if (!TestMode && !Arc.BrokenFileHeader &&          (Arc.NewLhd.FullPackSize<<11)>Arc.NewLhd.FullUnpSize &&          (Arc.NewLhd.FullUnpSize<100000000 || Arc.FileLength()>Arc.NewLhd.FullPackSize))        CurFile.Prealloc(Arc.NewLhd.FullUnpSize);#endif      CurFile.SetAllowDelete(!Cmd->KeepBroken);      if (!ExtractLink(DataIO,Arc,DestFileName,DataIO.UnpFileCRC,Command=='X' || Command=='E') &&          (Arc.NewLhd.Flags & LHD_SPLIT_BEFORE)==0)        if (Arc.NewLhd.Method==0x30)          UnstoreFile(DataIO,Arc.NewLhd.FullUnpSize);        else        {          Unp->SetDestSize(Arc.NewLhd.FullUnpSize);#ifndef SFX_MODULE          if (Arc.NewLhd.UnpVer<=15)            Unp->DoUnpack(15,FileCount>1 && Arc.Solid);          else#endif            Unp->DoUnpack(Arc.NewLhd.UnpVer,Arc.NewLhd.Flags & LHD_SOLID);        }      if (Arc.IsOpened())        Arc.SeekToNext();      bool BrokenFile=false;      if (!SkipSolid)      {        if (Arc.OldFormat && UINT32(DataIO.UnpFileCRC)==UINT32(Arc.NewLhd.FileCRC) ||            !Arc.OldFormat && UINT32(DataIO.UnpFileCRC)==UINT32(Arc.NewLhd.FileCRC^0xffffffff))        {#ifndef GUI          if (Command!='P' && Command!='I')            mprintf("%s%s ",Cmd->DisablePercentage ? " ":"\b\b\b\b\b ",St(MOk));#endif        }        else        {          char *BadArcName=(Arc.NewLhd.Flags & LHD_SPLIT_BEFORE) ? NULL:Arc.FileName;          if (Arc.NewLhd.Flags & LHD_PASSWORD)          {            Log(BadArcName,St(MEncrBadCRC),ArcFileName);          }          else          {            Log(BadArcName,St(MCRCFailed),ArcFileName);          }          BrokenFile=true;          ErrHandler.SetErrorCode(CRC_ERROR);#ifdef RARDLL          Cmd->DllError=ERAR_BAD_DATA;#endif          Alarm();        }      }#ifndef GUI      else        mprintf("\b\b\b\b\b     ");#endif      if (!TestMode && (Command=='X' || Command=='E') &&          !IsLink(Arc.NewLhd.FileAttr))      {#if defined(_WIN_32) || defined(_EMX)        if (Cmd->ClearArc)          Arc.NewLhd.FileAttr&=~FA_ARCH;#endif        if (!BrokenFile || Cmd->KeepBroken)        {          if (BrokenFile)            CurFile.Truncate();          CurFile.SetOpenFileStat(            Cmd->xmtime==EXTTIME_NONE ? NULL:&Arc.NewLhd.mtime,            Cmd->xctime==EXTTIME_NONE ? NULL:&Arc.NewLhd.ctime,            Cmd->xatime==EXTTIME_NONE ? NULL:&Arc.NewLhd.atime);          CurFile.Close();          CurFile.SetCloseFileStat(            Cmd->xmtime==EXTTIME_NONE ? NULL:&Arc.NewLhd.mtime,            Cmd->xatime==EXTTIME_NONE ? NULL:&Arc.NewLhd.atime,            Arc.NewLhd.FileAttr);          PrevExtracted=true;        }      }    }  }  if (ExactMatch)    MatchedArgs++;  if (DataIO.NextVolumeMissing || !Arc.IsOpened())    return(false);  if (!ExtrFile)    if (!Arc.Solid)      Arc.SeekToNext();    else      if (!SkipSolid)        return(false);  return(true);}void CmdExtract::UnstoreFile(ComprDataIO &DataIO,Int64 DestUnpSize){  Array<byte> Buffer(0x10000);  while (1)  {    unsigned int Code=DataIO.UnpRead(&Buffer[0],Buffer.Size());    if (Code==0 || (int)Code==-1)      break;    Code=Code<DestUnpSize ? Code:int64to32(DestUnpSize);    DataIO.UnpWrite(&Buffer[0],Code);    if (DestUnpSize>=0)      DestUnpSize-=Code;  }}

⌨️ 快捷键说明

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