3 #include "XFileUtils.h"
7 void SetDirTime(const char *Name,RarTime *ftm,RarTime *ftc,RarTime *fta)
10 bool sm=ftm!=NULL && ftm->IsSet();
11 bool sc=ftc!=NULL && ftc->IsSet();
12 bool sa=ftc!=NULL && fta->IsSet();
15 HANDLE hFile=CreateFile(Name,GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE,
16 NULL,OPEN_EXISTING,FILE_FLAG_BACKUP_SEMANTICS,NULL);
17 if (hFile==INVALID_HANDLE_VALUE)
26 SetFileTime(hFile,sc ? &fc:NULL,sa ? &fa:NULL,sm ? &fm:NULL);
29 #if defined(_UNIX) || defined(_EMX)
30 File::SetCloseFileTimeByName(Name,ftm,fta);
35 bool IsRemovable(const char *Name)
37 #if defined(TARGET_POSIX)
40 #elif defined(_WIN_32)
42 GetPathRoot(Name,Root);
43 int Type=GetDriveType(*Root ? Root:NULL);
44 return(Type==DRIVE_REMOVABLE || Type==DRIVE_CDROM);
46 char Drive=toupper(Name[0]);
47 return((Drive=='A' || Drive=='B') && Name[1]==':');
55 Int64 GetFreeDisk(const char *Name)
57 #if defined(TARGET_POSIX)
59 GetPathRoot(Name,Root);
61 ULARGE_INTEGER uiTotalSize,uiTotalFree,uiUserFree;
62 uiUserFree.u.LowPart=uiUserFree.u.HighPart=0;
63 if ( GetDiskFreeSpaceEx( Root, &uiUserFree, &uiTotalSize, &uiTotalFree ) ) {
64 return(int32to64(uiUserFree.u.HighPart,uiUserFree.u.LowPart));
69 #elif defined(_WIN_32)
71 GetPathRoot(Name,Root);
73 typedef BOOL (WINAPI *GETDISKFREESPACEEX)(
74 LPCTSTR,PULARGE_INTEGER,PULARGE_INTEGER,PULARGE_INTEGER
76 static GETDISKFREESPACEEX pGetDiskFreeSpaceEx=NULL;
78 if (pGetDiskFreeSpaceEx==NULL)
80 HMODULE hKernel=GetModuleHandle("kernel32.dll");
82 pGetDiskFreeSpaceEx=(GETDISKFREESPACEEX)GetProcAddress(hKernel,"GetDiskFreeSpaceExA");
84 if (pGetDiskFreeSpaceEx!=NULL)
86 GetFilePath(Name,Root);
87 ULARGE_INTEGER uiTotalSize,uiTotalFree,uiUserFree;
88 uiUserFree.u.LowPart=uiUserFree.u.HighPart=0;
89 if (pGetDiskFreeSpaceEx(*Root ? Root:NULL,&uiUserFree,&uiTotalSize,&uiTotalFree) &&
90 uiUserFree.u.HighPart<=uiTotalFree.u.HighPart)
91 return(int32to64(uiUserFree.u.HighPart,uiUserFree.u.LowPart));
94 DWORD SectorsPerCluster,BytesPerSector,FreeClusters,TotalClusters;
95 if (!GetDiskFreeSpace(*Root ? Root:NULL,&SectorsPerCluster,&BytesPerSector,&FreeClusters,&TotalClusters))
97 Int64 FreeSize=SectorsPerCluster*BytesPerSector;
98 FreeSize=FreeSize*FreeClusters;
102 GetFilePath(Name,Root);
103 dev_t Dev=dev_for_path(*Root ? Root:".");
107 if (fs_stat_dev(Dev,&Info)!=0)
109 Int64 FreeSize=Info.block_size;
110 FreeSize=FreeSize*Info.free_blocks;
115 int Drive=(!isalpha(Name[0]) || Name[1]!=':') ? 0:toupper(Name[0])-'A'+1;
116 if (_osmode == OS2_MODE)
119 if (DosQueryFSInfo(Drive,1,&fsa,sizeof(fsa))!=0)
121 Int64 FreeSize=fsa.cSectorUnit*fsa.cbSector;
122 FreeSize=FreeSize*fsa.cUnitAvail;
127 union REGS regs,outregs;
128 memset(®s,0,sizeof(regs));
131 _int86 (0x21,®s,&outregs);
132 if (outregs.x.ax==0xffff)
134 Int64 FreeSize=outregs.x.ax*outregs.x.cx;
135 FreeSize=FreeSize*outregs.x.bx;
139 #define DISABLEAUTODETECT
146 bool FileExist(const char *Name,const wchar *NameW)
149 #if !defined(TARGET_POSIX)
150 if (WinNT() && NameW!=NULL && *NameW!=0)
151 return(GetFileAttributesW(NameW)!=0xffffffff);
154 return(GetFileAttributes(Name)!=0xffffffff);
155 #elif defined(ENABLE_ACCESS)
156 return(access(Name,0)==0);
159 return(FindFile::FastFind(Name,NameW,&FD));
164 bool WildFileExist(const char *Name,const wchar *NameW)
166 if (IsWildcard(Name,NameW))
170 Find.SetMaskW(NameW);
172 return(Find.Next(&fd));
174 return(FileExist(Name,NameW));
178 bool IsDir(uint Attr)
180 #if defined (_WIN_32) || defined(_EMX)
181 return(Attr!=0xffffffff && (Attr & 0x10)!=0);
184 return((Attr & 0xF000)==0x4000);
189 bool IsUnreadable(uint Attr)
191 #if defined(_UNIX) && defined(S_ISFIFO) && defined(S_ISSOCK) && defined(S_ISCHR)
192 return(S_ISFIFO(Attr) || S_ISSOCK(Attr) || S_ISCHR(Attr));
198 bool IsLabel(uint Attr)
200 #if defined (_WIN_32) || defined(_EMX)
201 return((Attr & 8)!=0);
208 bool IsLink(uint Attr)
211 return((Attr & 0xF000)==0xA000);
221 bool IsDeleteAllowed(uint FileAttr)
223 #if defined(_WIN_32) || defined(_EMX)
224 return((FileAttr & (FA_RDONLY|FA_SYSTEM|FA_HIDDEN))==0);
226 return((FileAttr & (S_IRUSR|S_IWUSR))==(S_IRUSR|S_IWUSR));
231 void PrepareToDelete(const char *Name,const wchar *NameW)
233 #if defined(_WIN_32) || defined(_EMX)
234 SetFileAttr(Name,NameW,0);
237 chmod(Name,S_IRUSR|S_IWUSR|S_IXUSR);
242 uint GetFileAttr(const char *Name,const wchar *NameW)
245 #if !defined(TARGET_POSIX)
246 if (WinNT() && NameW!=NULL && *NameW!=0)
247 return(GetFileAttributesW(NameW));
250 return(GetFileAttributes(Name));
251 #elif defined(_DJGPP)
252 return(_chmod(Name,0));
255 if (stat(Name,&st)!=0)
266 bool SetFileAttr(const char *Name,const wchar *NameW,uint Attr)
270 #if !defined(TARGET_POSIX)
271 if (WinNT() && NameW!=NULL && *NameW!=0)
272 success=SetFileAttributesW(NameW,Attr)!=0;
275 success=SetFileAttributes(Name,Attr)!=0;
276 #elif defined(_DJGPP)
277 success=_chmod(Name,1,Attr)!=-1;
279 success=__chmod(Name,1,Attr)!=-1;
281 success=chmod(Name,(mode_t)Attr)==0;
289 void ConvertNameToFull(const char *Src,char *Dest)
293 #if !defined(_WIN_CE) && !defined(TARGET_POSIX)
294 char FullName[NM],*NamePtr;
295 if (GetFullPathName(Src,sizeof(FullName),FullName,&NamePtr))
296 strcpy(Dest,FullName);
303 if (IsPathDiv(*Src) || IsDiskLetter(Src))
304 strcpy(FullName,Src);
307 if (getcwd(FullName,sizeof(FullName)))
309 AddEndSlash(FullName);
310 strcat(FullName,Src);
313 strcpy(Dest,FullName);
319 void ConvertNameToFull(const wchar *Src,wchar *Dest)
321 if (Src==NULL || *Src==0)
332 #if !defined(_WIN_CE) && !defined(TARGET_POSIX)
333 wchar FullName[NM],*NamePtr;
334 if (GetFullPathNameW(Src,sizeof(FullName)/sizeof(FullName[0]),FullName,&NamePtr))
335 strcpyw(Dest,FullName);
345 WideToChar(Src,AnsiName);
346 ConvertNameToFull(AnsiName,AnsiName);
347 CharToWide(AnsiName,Dest);
352 WideToChar(Src,AnsiName);
353 ConvertNameToFull(AnsiName,AnsiName);
354 CharToWide(AnsiName,Dest);
361 char *MkTemp(char *Name)
363 int Length=strlen(Name);
367 for (int Attempt=0;;Attempt++)
369 sprintf(Name+Length-6,"%06u",Random+Attempt);
371 if (!FileExist(Name))
384 uint CalcFileCRC(File *SrcFile,Int64 Size)
386 SaveFilePos SavePos(*SrcFile);
387 const int BufSize=0x10000;
388 Array<byte> Data(BufSize);
390 uint DataCRC=0xffffffff;
394 SrcFile->Seek(0,SEEK_SET);
395 while ((ReadSize=SrcFile->Read(&Data[0],int64to32(Size==INT64ERR ? Int64(BufSize):Min(Int64(BufSize),Size))))!=0)
398 if ((BlockCount & 15)==0)
402 DataCRC=CRC(DataCRC,&Data[0],ReadSize);
406 return(DataCRC^0xffffffff);
411 bool RenameFile(const char *SrcName,const wchar *SrcNameW,const char *DestName,const wchar *DestNameW)
413 return(rename(SrcName,DestName)==0);
417 bool DelFile(const char *Name)
419 return(DelFile(Name,NULL));
423 bool DelFile(const char *Name,const wchar *NameW)
425 return(remove(Name)==0);
429 bool DelDir(const char *Name)
431 return(DelDir(Name,NULL));
435 bool DelDir(const char *Name,const wchar *NameW)
437 return(rmdir(Name)==0);