Gray C++ Libraries  0.0.2
A set of C++ libraries for MSVC, GNU on Windows, WinCE, Linux
cFileStatus.h
Go to the documentation of this file.
1 //
4 //
5 
6 #ifndef _INC_CFileStatus_H
7 #define _INC_CFileStatus_H
8 #ifndef NO_PRAGMA_ONCE
9 #pragma once
10 #endif
11 
12 #include "FileName.h"
13 #include "cTimeFile.h"
14 #include "cTimeInt.h"
15 #include "cValT.h"
16 #include "cStreamProgress.h"
17 #include "HResult.h"
18 
19 #ifdef _WIN32
20 typedef WIN32_FIND_DATAW cFileStatusSys; // or BY_HANDLE_FILE_INFORMATION ?
21 #else
22 struct stat;
23 typedef struct stat cFileStatusSys; // from stat(), lstat() or fstat()
24 #endif
25 
26 namespace Gray
27 {
28 #ifdef _WIN32
29  typedef ULONGLONG FILE_SIZE_t;
30 #else
31  typedef UINT64 FILE_SIZE_t;
32 #endif
33 
35  {
39  FILEATTR_ReadOnly = 0x0001,
40  FILEATTR_Hidden = 0x0002,
41  FILEATTR_System = 0x0004,
42 
44 
45  FILEATTR_Directory = 0x0010,
46  FILEATTR_Archive = 0x0020,
47  FILEATTR_Volume = 0x0040,
48  FILEATTR_Normal = 0x0080,
49 
50  // NTFS only flags. (maybe Linux)
51  FILEATTR_Temporary = 0x0100,
52  FILEATTR_Link = 0x0400,
53  FILEATTR_Compress = 0x0800,
54  };
55  typedef UINT32 FILEATTR_MASK_t; // FILEATTR_TYPE_ mask
56 
58  {
64 
65  typedef cFileStatus THIS_t;
66 
67  public:
73 
74  public:
75  cFileStatus();
76  cFileStatus(const FILECHAR_t* pszFilePath);
77 
78  void InitFileStatus();
79  void InitFileStatus(const cFileStatusSys& statusSys);
80 
81 #if defined(__linux__)
82  static HRESULT GRAYCALL GetStatusSys(OUT cFileStatusSys& statusSys, const FILECHAR_t* pszName, bool bFollowLinks = false);
83 #endif
84 
85  static bool IsLinuxHidden(const FILECHAR_t* pszName) noexcept
86  {
88  if (pszName == nullptr)
89  return true;
90  return pszName[0] == '.';
91  }
92  bool UpdateLinuxHidden(const FILECHAR_t* pszName) noexcept
93  {
95  if (IsLinuxHidden(pszName))
96  {
97  m_Attributes |= FILEATTR_Hidden;
98  return true;
99  }
100  return false;
101  }
102 
103  bool isFileValid() const noexcept
104  {
108  return m_timeChange.isValid();
109  }
110 
112  {
114  return cValT::Compare(t1.get_FAT32(), t2.get_FAT32());
115  }
116  bool IsSameChangeFileTime(const cTimeFile& t2) const noexcept
117  {
119  return cValT::Compare(m_timeChange.get_FAT32(), t2.get_FAT32()) == COMPARE_Equal;
120  }
121  static TIMESEC_t GRAYCALL MakeFatTime(TIMESEC_t tTime) noexcept
122  {
124  return tTime & ~1;
125  }
126  static COMPARE_t GRAYCALL CompareChangeTime(const cTimeInt& t1, const cTimeInt& t2) noexcept
127  {
129  return cValT::Compare(MakeFatTime(t1.GetTime()), MakeFatTime(t2.GetTime()));
130  }
131  bool IsSameChangeTime(const cTimeInt& t2) const noexcept
132  {
133  return CompareChangeTime(m_timeChange, t2) == COMPARE_Equal;
134  }
135 
136  bool IsFileEqualTo(const THIS_t& rFileStatus) const noexcept
137  {
138  if (cValT::Compare(m_timeCreate.get_Val(), rFileStatus.m_timeCreate.get_Val()) != COMPARE_Equal)
139  return false;
140  if (!IsSameChangeFileTime(rFileStatus.m_timeChange))
141  return false;
142  if (m_Size != rFileStatus.m_Size)
143  return false;
144  return true;
145  }
146  bool IsFileEqualTo(const THIS_t* pFileStatus) const noexcept
147  {
149  if (pFileStatus == nullptr)
150  return false;
151  return IsFileEqualTo(*pFileStatus);
152  }
153  bool IsAttrMask(FILEATTR_MASK_t dwAttrMask = FILEATTR_ReadOnly) const noexcept
154  {
156  return(m_Attributes & dwAttrMask) ? true : false;
157  }
158  bool isAttrDir() const noexcept
159  {
160  return IsAttrMask(FILEATTR_Directory);
161  }
162  bool isAttrHidden() const noexcept
163  {
164  // for __linux__ starts with .
165  return IsAttrMask(FILEATTR_Hidden);
166  }
167  FILE_SIZE_t GetFileLength() const noexcept
168  {
171  return m_Size;
172  }
173 
174  static HRESULT GRAYCALL WriteFileAttributes(const FILECHAR_t* pszFilePath, FILEATTR_MASK_t dwAttributes);
175  static HRESULT GRAYCALL WriteFileTimes(const FILECHAR_t* pszFilePath, const cTimeFile* pTimeCreate, const cTimeFile* pTimeChange = nullptr);
176  static HRESULT GRAYCALL WriteFileTimes(const FILECHAR_t* pszFilePath, const cFileStatus& rFileStatus);
177  static HRESULT GRAYCALL ReadFileStatus2(const FILECHAR_t* pszFilePath, cFileStatus* pFileStatus = nullptr, bool bFollowLink = false);
178 
179  static bool GRAYCALL Exists(const FILECHAR_t* pszFilePath)
180  {
182  HRESULT hRes = ReadFileStatus2(pszFilePath, nullptr, true);
183  return SUCCEEDED(hRes);
184  }
185 
186  HRESULT ReadFileStatus(const FILECHAR_t* pszFilePath, bool bFollowLink = false)
187  {
188  return ReadFileStatus2(pszFilePath, this, bFollowLink);
189  }
190  };
191 }
192 
193 #endif
#define GRAYCORE_LINK
Definition: GrayCore.h:47
#define GRAYCALL
declare calling convention for static functions so everyone knows the arg passing scheme....
Definition: GrayCore.h:36
#define SUCCEEDED(x)
Definition: HResult.h:29
INT32 HRESULT
_WIN32 style error codes. INT32
Definition: SysTypes.h:465
struct stat cFileStatusSys
Definition: cFileStatus.h:23
Definition: cFileStatus.h:58
bool isAttrHidden() const noexcept
Definition: cFileStatus.h:162
static bool IsLinuxHidden(const FILECHAR_t *pszName) noexcept
Definition: cFileStatus.h:85
static bool __stdcall Exists(const FILECHAR_t *pszFilePath)
Definition: cFileStatus.h:179
bool IsAttrMask(FILEATTR_MASK_t dwAttrMask=FILEATTR_ReadOnly) const noexcept
Definition: cFileStatus.h:153
bool IsSameChangeFileTime(const cTimeFile &t2) const noexcept
(accurate to 2 seconds)
Definition: cFileStatus.h:116
bool IsSameChangeTime(const cTimeInt &t2) const noexcept
Definition: cFileStatus.h:131
static COMPARE_t __stdcall CompareChangeTime(const cTimeInt &t1, const cTimeInt &t2) noexcept
Definition: cFileStatus.h:126
bool IsFileEqualTo(const THIS_t *pFileStatus) const noexcept
Definition: cFileStatus.h:146
cTimeFile m_timeChange
m_mtime = real world time/date of last modification. (FAT32 only accurate to 2 seconds) // All OS sup...
Definition: cFileStatus.h:69
FILE_SIZE_t GetFileLength() const noexcept
Definition: cFileStatus.h:167
bool isAttrDir() const noexcept
Definition: cFileStatus.h:158
FILEATTR_MASK_t m_Attributes
Mask of FILEATTR_TYPE_ attribute bits. FILEATTR_None.
Definition: cFileStatus.h:72
cTimeFile m_timeCreate
m_ctime = (may not be supported by file system).
Definition: cFileStatus.h:68
bool IsFileEqualTo(const THIS_t &rFileStatus) const noexcept
Definition: cFileStatus.h:136
bool UpdateLinuxHidden(const FILECHAR_t *pszName) noexcept
Definition: cFileStatus.h:92
static TIMESEC_t __stdcall MakeFatTime(TIMESEC_t tTime) noexcept
Definition: cFileStatus.h:121
bool isFileValid() const noexcept
Definition: cFileStatus.h:103
HRESULT ReadFileStatus(const FILECHAR_t *pszFilePath, bool bFollowLink=false)
Definition: cFileStatus.h:186
FILE_SIZE_t m_Size
file size in bytes. size_t. not always accurate for directories. (-1)
Definition: cFileStatus.h:71
cTimeFile m_timeLastAccess
m_atime = time of last access/Open. (For Caching). (may not be supported by file system)
Definition: cFileStatus.h:70
static COMPARE_t __stdcall CompareChangeFileTime(const cTimeFile &t1, const cTimeFile &t2)
(accurate to 2 seconds)
Definition: cFileStatus.h:111
Definition: cTimeFile.h:31
FILETIME_t get_FAT32() const noexcept
Definition: cTimeFile.h:119
FILETIME_t get_Val() const noexcept
Definition: cTimeFile.h:112
bool isValid() const noexcept
Definition: cTimeFile.h:128
< similar to the MFC CTime and cTimeSpan, not as accurate or large ranged as COleDateTime
Definition: cTimeInt.h:101
< The main namespace for all Core functions.
Definition: GrayCore.cpp:14
int COMPARE_t
result of compare. 0=same, 1=a>b, -1=a<b
Definition: cValT.h:17
FILEATTR_TYPE_
Definition: cFileStatus.h:35
@ FILEATTR_Link
FILE_ATTRIBUTE_REPARSE_POINT = a link. This file doesn't really exist locally but is listed in the di...
Definition: cFileStatus.h:52
@ FILEATTR_Hidden
FILE_ATTRIBUTE_HIDDEN. linux starts with .
Definition: cFileStatus.h:40
@ FILEATTR_Volume
FILE_ATTRIBUTE_DEVICE = some sort of device. not a file or dir. e.g. COM1.
Definition: cFileStatus.h:47
@ FILEATTR_ReadOnly
FILE_ATTRIBUTE_READONLY. linux permissions for user ?
Definition: cFileStatus.h:39
@ FILEATTR_Archive
FILE_ATTRIBUTE_ARCHIVE = this has been changed. (needs to be archived) not yet backed up.
Definition: cFileStatus.h:46
@ FILEATTR_NormalMask
(FILEATTR_ReadOnly|FILEATTR_Hidden|FILEATTR_System)
Definition: cFileStatus.h:43
@ FILEATTR_Normal
FILE_ATTRIBUTE_NORMAL = just a file.
Definition: cFileStatus.h:48
@ FILEATTR_Temporary
FILE_ATTRIBUTE_TEMPORARY.
Definition: cFileStatus.h:51
@ FILEATTR_None
Definition: cFileStatus.h:38
@ FILEATTR_Directory
FILE_ATTRIBUTE_DIRECTORY.
Definition: cFileStatus.h:45
@ FILEATTR_Compress
FILE_ATTRIBUTE_COMPRESSED. this is a file that will act like a ATTR_directory. (sort of)
Definition: cFileStatus.h:53
@ FILEATTR_System
FILE_ATTRIBUTE_SYSTEM.
Definition: cFileStatus.h:41
class __DECL_IMPORT cFileStatus
Definition: cFile.h:79
char FILECHAR_t
a UTF8 char in a file name. like TCHAR
Definition: FileName.h:22
time_t TIMESEC_t
absolute seconds since January 1, 1970. (GMT?)(signed) NOTE: Changing to __time64_t just adds more ra...
Definition: cTimeUnits.h:23
UINT32 FILEATTR_MASK_t
Definition: cFileStatus.h:55
UINT64 FILE_SIZE_t
similar to STREAM_POS_t size_t
Definition: cFileStatus.h:31
@ COMPARE_Equal
VARCMP_EQ.
Definition: cValT.h:23
static COMPARE_t Compare(const TYPE &a, const TYPE &b) noexcept
Definition: cValT.h:46