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

📄 filefn.cpp

📁 Rar 的控制台解压程序
💻 CPP
字号:
#include "rar.hpp"MKDIR_CODE MakeDir(const char *Name,const wchar *NameW,uint Attr){#ifdef _WIN_32  int Success;  if (WinNT() && NameW!=NULL && *NameW!=0)    Success=CreateDirectoryW(NameW,NULL);  else    Success=CreateDirectory(Name,NULL);  if (Success)  {    SetFileAttr(Name,NameW,Attr);    return(MKDIR_SUCCESS);  }  int ErrCode=GetLastError();  if (ErrCode==ERROR_FILE_NOT_FOUND || ErrCode==ERROR_PATH_NOT_FOUND)    return(MKDIR_BADPATH);  return(MKDIR_ERROR);#endif#ifdef _EMX#ifdef _DJGPP  if (mkdir(Name,(Attr & FA_RDONLY) ? 0:S_IWUSR)==0)#else  if (__mkdir(Name)==0)#endif  {    SetFileAttr(Name,NameW,Attr);    return(MKDIR_SUCCESS);  }  return(errno==ENOENT ? MKDIR_BADPATH:MKDIR_ERROR);#endif#ifdef _UNIX  int prevmask=umask(0);  int ErrCode=Name==NULL ? -1:mkdir(Name,(mode_t)Attr);  umask(prevmask);  if (ErrCode==-1)    return(errno==ENOENT ? MKDIR_BADPATH:MKDIR_ERROR);  return(MKDIR_SUCCESS);#endif}void CreatePath(const char *Path,const wchar *PathW,bool SkipLastName){#ifdef _WIN_32  uint DirAttr=0;#else  uint DirAttr=0777;#endif#ifdef UNICODE_SUPPORTED  bool Wide=PathW!=NULL && *PathW!=0 && UnicodeEnabled();#else  bool Wide=false;#endif  bool IgnoreAscii=false;  const char *s=Path;  for (int PosW=0;;PosW++)  {    if (s==NULL || s-Path>=NM || *s==0)      IgnoreAscii=true;    if (Wide && (PosW>=NM || PathW[PosW]==0) || !Wide && IgnoreAscii)      break;    if (Wide && PathW[PosW]==CPATHDIVIDER || !Wide && *s==CPATHDIVIDER)    {      wchar *DirPtrW=NULL,DirNameW[NM];      if (Wide)      {        strncpyw(DirNameW,PathW,PosW);        DirNameW[PosW]=0;        DirPtrW=DirNameW;      }      char DirName[NM];      if (IgnoreAscii)        WideToChar(DirPtrW,DirName);      else      {#ifndef DBCS_SUPPORTED        if (*s!=CPATHDIVIDER)          for (const char *n=s;*n!=0 && n-Path<NM;n++)            if (*n==CPATHDIVIDER)            {              s=n;              break;            }#endif        strncpy(DirName,Path,s-Path);        DirName[s-Path]=0;      }      if (MakeDir(DirName,DirPtrW,DirAttr)==MKDIR_SUCCESS)      {#ifndef GUI        mprintf(St(MCreatDir),DirName);        mprintf(" %s",St(MOk));#endif      }    }    if (!IgnoreAscii)      s=charnext(s);  }  if (!SkipLastName && !IsPathDiv(*PointToLastChar(Path)))    MakeDir(Path,PathW,DirAttr);}void SetDirTime(const char *Name,RarTime *ftm,RarTime *ftc,RarTime *fta){#ifdef _WIN_32  if (!WinNT())    return;  bool sm=ftm!=NULL && ftm->IsSet();  bool sc=ftc!=NULL && ftc->IsSet();  bool sa=fta!=NULL && fta->IsSet();  unsigned int DirAttr=GetFileAttr(Name);  bool ResetAttr=(DirAttr!=0xffffffff && (DirAttr & FA_RDONLY)!=0);  if (ResetAttr)    SetFileAttr(Name,NULL,0);  HANDLE hFile=CreateFile(Name,GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE,                          NULL,OPEN_EXISTING,FILE_FLAG_BACKUP_SEMANTICS,NULL);  if (hFile==INVALID_HANDLE_VALUE)    return;  FILETIME fm,fc,fa;  if (sm)    ftm->GetWin32(&fm);  if (sc)    ftc->GetWin32(&fc);  if (sa)    fta->GetWin32(&fa);  SetFileTime(hFile,sc ? &fc:NULL,sa ? &fa:NULL,sm ? &fm:NULL);  CloseHandle(hFile);  if (ResetAttr)    SetFileAttr(Name,NULL,DirAttr);#endif#if defined(_UNIX) || defined(_EMX)  File::SetCloseFileTimeByName(Name,ftm,fta);#endif}bool IsRemovable(const char *Name){#ifdef _WIN_32  char Root[NM];  GetPathRoot(Name,Root);  int Type=GetDriveType(*Root ? Root:NULL);  return(Type==DRIVE_REMOVABLE || Type==DRIVE_CDROM);#elif defined(_EMX)  char Drive=toupper(Name[0]);  return((Drive=='A' || Drive=='B') && Name[1]==':');#else  return(false);#endif}#ifndef SFX_MODULEInt64 GetFreeDisk(const char *Name){#ifdef _WIN_32  char Root[NM];  GetPathRoot(Name,Root);  typedef BOOL (WINAPI *GETDISKFREESPACEEX)(    LPCTSTR,PULARGE_INTEGER,PULARGE_INTEGER,PULARGE_INTEGER   );  static GETDISKFREESPACEEX pGetDiskFreeSpaceEx=NULL;  if (pGetDiskFreeSpaceEx==NULL)  {    HMODULE hKernel=GetModuleHandle("kernel32.dll");    if (hKernel!=NULL)      pGetDiskFreeSpaceEx=(GETDISKFREESPACEEX)GetProcAddress(hKernel,"GetDiskFreeSpaceExA");  }  if (pGetDiskFreeSpaceEx!=NULL)  {    GetFilePath(Name,Root);    ULARGE_INTEGER uiTotalSize,uiTotalFree,uiUserFree;    uiUserFree.u.LowPart=uiUserFree.u.HighPart=0;    if (pGetDiskFreeSpaceEx(*Root ? Root:NULL,&uiUserFree,&uiTotalSize,&uiTotalFree) &&        uiUserFree.u.HighPart<=uiTotalFree.u.HighPart)      return(int32to64(uiUserFree.u.HighPart,uiUserFree.u.LowPart));  }  DWORD SectorsPerCluster,BytesPerSector,FreeClusters,TotalClusters;  if (!GetDiskFreeSpace(*Root ? Root:NULL,&SectorsPerCluster,&BytesPerSector,&FreeClusters,&TotalClusters))    return(1457664);  Int64 FreeSize=SectorsPerCluster*BytesPerSector;  FreeSize=FreeSize*FreeClusters;  return(FreeSize);#elif defined(_BEOS)  char Root[NM];  GetFilePath(Name,Root);  dev_t Dev=dev_for_path(*Root ? Root:".");  if (Dev<0)    return(1457664);  fs_info Info;  if (fs_stat_dev(Dev,&Info)!=0)    return(1457664);  Int64 FreeSize=Info.block_size;  FreeSize=FreeSize*Info.free_blocks;  return(FreeSize);#elif defined(_UNIX)  return(1457664);#elif defined(_EMX)  int Drive=(!isalpha(Name[0]) || Name[1]!=':') ? 0:toupper(Name[0])-'A'+1;  if (_osmode == OS2_MODE)  {    FSALLOCATE fsa;    if (DosQueryFSInfo(Drive,1,&fsa,sizeof(fsa))!=0)      return(1457664);    Int64 FreeSize=fsa.cSectorUnit*fsa.cbSector;    FreeSize=FreeSize*fsa.cUnitAvail;    return(FreeSize);  }  else  {    union REGS regs,outregs;    memset(&regs,0,sizeof(regs));    regs.h.ah=0x36;    regs.h.dl=Drive;    _int86 (0x21,&regs,&outregs);    if (outregs.x.ax==0xffff)      return(1457664);    Int64 FreeSize=outregs.x.ax*outregs.x.cx;    FreeSize=FreeSize*outregs.x.bx;    return(FreeSize);  }#else  #define DISABLEAUTODETECT  return(1457664);#endif}#endifbool FileExist(const char *Name,const wchar *NameW){#ifdef _WIN_32    if (WinNT() && NameW!=NULL && *NameW!=0)      return(GetFileAttributesW(NameW)!=0xffffffff);    else      return(GetFileAttributes(Name)!=0xffffffff);#elif defined(ENABLE_ACCESS)  return(access(Name,0)==0);#else  struct FindData FD;  return(FindFile::FastFind(Name,NameW,&FD));#endif}bool WildFileExist(const char *Name,const wchar *NameW){  if (IsWildcard(Name,NameW))  {    FindFile Find;    Find.SetMask(Name);    Find.SetMaskW(NameW);    struct FindData fd;    return(Find.Next(&fd));  }  return(FileExist(Name,NameW));}bool IsDir(uint Attr){#if defined (_WIN_32) || defined(_EMX)  return(Attr!=0xffffffff && (Attr & 0x10)!=0);#endif#if defined(_UNIX)  return((Attr & 0xF000)==0x4000);#endif}bool IsUnreadable(uint Attr){#if defined(_UNIX) && defined(S_ISFIFO) && defined(S_ISSOCK) && defined(S_ISCHR)  return(S_ISFIFO(Attr) || S_ISSOCK(Attr) || S_ISCHR(Attr));#endif  return(false);}bool IsLabel(uint Attr){#if defined (_WIN_32) || defined(_EMX)  return((Attr & 8)!=0);#else  return(false);#endif}bool IsLink(uint Attr){#ifdef _UNIX  return((Attr & 0xF000)==0xA000);#else  return(false);#endif}bool IsDeleteAllowed(uint FileAttr){#if defined(_WIN_32) || defined(_EMX)  return((FileAttr & (FA_RDONLY|FA_SYSTEM|FA_HIDDEN))==0);#else  return((FileAttr & (S_IRUSR|S_IWUSR))==(S_IRUSR|S_IWUSR));#endif}void PrepareToDelete(const char *Name,const wchar *NameW){#if defined(_WIN_32) || defined(_EMX)  SetFileAttr(Name,NameW,0);#endif#ifdef _UNIX  chmod(Name,S_IRUSR|S_IWUSR|S_IXUSR);#endif}uint GetFileAttr(const char *Name,const wchar *NameW){#ifdef _WIN_32    if (WinNT() && NameW!=NULL && *NameW!=0)      return(GetFileAttributesW(NameW));    else      return(GetFileAttributes(Name));#elif defined(_DJGPP)  return(_chmod(Name,0));#else  struct stat st;  if (stat(Name,&st)!=0)    return(0);#ifdef _EMX  return(st.st_attr);#else  return(st.st_mode);#endif#endif}bool SetFileAttr(const char *Name,const wchar *NameW,uint Attr){  bool Success;#ifdef _WIN_32    if (WinNT() && NameW!=NULL && *NameW!=0)      Success=SetFileAttributesW(NameW,Attr)!=0;    else      Success=SetFileAttributes(Name,Attr)!=0;#elif defined(_DJGPP)  Success=_chmod(Name,1,Attr)!=-1;#elif defined(_EMX)  Success=__chmod(Name,1,Attr)!=-1;#elif defined(_UNIX)  Success=chmod(Name,(mode_t)Attr)==0;#else  Success=false;#endif  return(Success);}void ConvertNameToFull(const char *Src,char *Dest){#ifdef _WIN_32#ifndef _WIN_CE  char FullName[NM],*NamePtr;  if (GetFullPathName(Src,sizeof(FullName),FullName,&NamePtr))    strcpy(Dest,FullName);  else#endif    if (Src!=Dest)      strcpy(Dest,Src);#else  char FullName[NM];  if (IsPathDiv(*Src) || IsDiskLetter(Src))    strcpy(FullName,Src);  else  {    getcwd(FullName,sizeof(FullName));    AddEndSlash(FullName);    strcat(FullName,Src);  }  strcpy(Dest,FullName);#endif}#ifndef SFX_MODULEvoid ConvertNameToFull(const wchar *Src,wchar *Dest){  if (Src==NULL || *Src==0)  {    *Dest=0;    return;  }#ifdef _WIN_32#ifndef _WIN_CE  if (WinNT())#endif  {#ifndef _WIN_CE    wchar FullName[NM],*NamePtr;    if (GetFullPathNameW(Src,sizeof(FullName)/sizeof(FullName[0]),FullName,&NamePtr))      strcpyw(Dest,FullName);    else#endif      if (Src!=Dest)        strcpyw(Dest,Src);  }#ifndef _WIN_CE  else  {    char AnsiName[NM];    WideToChar(Src,AnsiName);    ConvertNameToFull(AnsiName,AnsiName);    CharToWide(AnsiName,Dest);  }#endif#else  char AnsiName[NM];  WideToChar(Src,AnsiName);  ConvertNameToFull(AnsiName,AnsiName);  CharToWide(AnsiName,Dest);#endif}#endif#ifndef SFX_MODULEchar *MkTemp(char *Name){  int Length=strlen(Name);  if (Length<=6)    return(NULL);  int Random=clock();  for (int Attempt=0;;Attempt++)  {    sprintf(Name+Length-6,"%06u",Random+Attempt);    Name[Length-4]='.';    if (!FileExist(Name))      break;    if (Attempt==1000)      return(NULL);  }  return(Name);}#endif#ifndef SFX_MODULEuint CalcFileCRC(File *SrcFile,Int64 Size){  SaveFilePos SavePos(*SrcFile);  const int BufSize=0x10000;  Array<byte> Data(BufSize);  Int64 BlockCount=0;  uint DataCRC=0xffffffff;  int ReadSize;  SrcFile->Seek(0,SEEK_SET);  while ((ReadSize=SrcFile->Read(&Data[0],int64to32(Size==INT64ERR ? Int64(BufSize):Min(Int64(BufSize),Size))))!=0)  {    ++BlockCount;    if ((BlockCount & 15)==0)    {      Wait();    }    DataCRC=CRC(DataCRC,&Data[0],ReadSize);    if (Size!=INT64ERR)      Size-=ReadSize;  }  return(DataCRC^0xffffffff);}#endifbool RenameFile(const char *SrcName,const wchar *SrcNameW,const char *DestName,const wchar *DestNameW){  return(rename(SrcName,DestName)==0);}bool DelFile(const char *Name){  return(DelFile(Name,NULL));}bool DelFile(const char *Name,const wchar *NameW){  return(remove(Name)==0);}bool DelDir(const char *Name){  return(DelDir(Name,NULL));}bool DelDir(const char *Name,const wchar *NameW){  return(rmdir(Name)==0);}#if defined(_WIN_32) && !defined(_WIN_CE)bool SetFileCompression(char *Name,wchar *NameW,bool State){  wchar FileNameW[NM];  GetWideName(Name,NameW,FileNameW);  HANDLE hFile=CreateFileW(FileNameW,FILE_READ_DATA|FILE_WRITE_DATA,                 FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,                 FILE_FLAG_BACKUP_SEMANTICS|FILE_FLAG_SEQUENTIAL_SCAN,NULL);  if (hFile==INVALID_HANDLE_VALUE)    return(false);  SHORT NewState=State ? COMPRESSION_FORMAT_DEFAULT:COMPRESSION_FORMAT_NONE;  DWORD Result;  int RetCode=DeviceIoControl(hFile,FSCTL_SET_COMPRESSION,&NewState,                              sizeof(NewState),NULL,0,&Result,NULL);  CloseHandle(hFile);  return(RetCode!=0);}#endif

⌨️ 快捷键说明

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