Gray C++ Libraries  0.0.2
A set of C++ libraries for MSVC, GNU on Windows, WinCE, Linux
cFileDir.h
Go to the documentation of this file.
1 //
4 //
5 
6 #ifndef _INC_cFileDir_H
7 #define _INC_cFileDir_H
8 #ifndef NO_PRAGMA_ONCE
9 #pragma once
10 #endif
11 
12 #include "cArrayString.h"
13 #include "cFile.h"
14 #include "cFileStatus.h"
15 #include "cTimeInt.h"
16 #include "cString.h"
17 #include "HResult.h"
18 
19 #ifdef __linux__
20 #include <dirent.h> // DIR
21 #endif
22 
24 {
28 #ifdef __linux__
29  FOF_ALLOWUNDO = 0x0040, // 0x0040 in WIN32 <shellapi.h>
30  FOF_FILESONLY = 0x0080, // 0x0080 in WIN32 <shellapi.h>
31  FOF_RENAMEONCOLLISION = 0x0100, // 8 in WIN32 (FOF_SIMPLEPROGRESS)
32  FOF_NOERRORUI = 0x400, // 0x0400 in WIN32 <shellapi.h>
33 #endif
34  // NON WIN32 standard.
35  FOF_X_FollowLinks = 0x10000,
36  FOF_X_WantDots = 0x20000,
37 #if ! USE_UNICODE_FN
38  FOF_X_UTF8 = 0x40000,
39 #endif
40 };
41 
42 namespace Gray
43 {
44  UNITTEST2_PREDEF(cFileDir);
45 
46 #ifdef _WIN32
47 #define FILEDEVICE_PREFIX "\\\\.\\" // usually _FN(FILEDEVICE_PREFIX). similar to "\\Device\\"
48 #elif defined(__linux__)
49 #define FILEDEVICE_PREFIX "/dev/"
50 #endif
51 
53  {
56  public:
57  static const char* k_FileSysName[FILESYS_QTY];
58 
59  // _WIN32 Info from GetVolumeInformation();
63  UINT64 m_nSerialNumber;
66 
67  public:
68  cFileDevice();
69  ~cFileDevice();
70 
71  HRESULT UpdateInfo(const FILECHAR_t* pszDeviceId = nullptr);
72 
74  {
75  return m_eType;
76  }
77  bool isCaseSensitive() const;
78 
79  static UINT GRAYCALL GetDeviceType(const FILECHAR_t* pszDeviceId);
80  static FILE_SIZE_t GRAYCALL GetDeviceFreeSpace(const FILECHAR_t* pszDeviceId = nullptr);
81  static HRESULT GRAYCALL GetSystemDeviceList(cArrayString<FILECHAR_t>& a);
82  };
83 
85  : public cFileStatus
86  {
90  typedef cFileStatus SUPER_t;
91  typedef cFileFindEntry THIS_t;
92 
93  public:
95 
96  public:
98  {
99  InitFileStatus();
100  }
101  explicit cFileFindEntry(const FILECHAR_t* pszFileName)
102  : m_sFileName(pszFileName)
103  {
104  InitFileStatus();
105  }
106  cFileFindEntry(const FILECHAR_t* pszFileName, const cFileStatus& status)
107  : cFileStatus(status)
108  , m_sFileName(pszFileName)
109  {
110  }
111  bool IsFileEqualTo(const THIS_t& rEntry) const
112  {
113  // Does file system use case ?
114  if (m_sFileName.CompareNoCase(rEntry.m_sFileName) != 0)
115  return false;
116  return SUPER_t::IsFileEqualTo(rEntry);
117  }
118  bool IsFileEqualTo(const THIS_t* pEntry) const
119  {
120  // Does file system use case ?
121  if (pEntry == nullptr)
122  return false;
123  return IsFileEqualTo(*pEntry);
124  }
125  bool operator == (const THIS_t& rEntry) const
126  {
127  return IsFileEqualTo(rEntry);
128  }
129  bool operator != (const THIS_t& rEntry) const
130  {
131  return !IsFileEqualTo(rEntry);
132  }
133  bool isDot() const
134  {
135  if (m_sFileName[0] != '.')
136  return false;
137  if (m_sFileName[1] == '\0')
138  return true;
139  return false;
140  }
141  bool isDots() const noexcept
142  {
144  if (m_sFileName[0] != '.')
145  return false;
146  if (m_sFileName[1] == '\0')
147  return true;
148  if (m_sFileName[1] != '.')
149  return false;
150  if (m_sFileName[2] == '\0')
151  return true;
152  return false;
153  }
155  {
156  return m_sFileName;
157  }
158  };
159 
161  {
166 
167  public:
169 
170  private:
171  cStringF m_sDirPath;
172  DWORD m_nFileFlags;
173 #ifdef _WIN32
174  WIN32_FIND_DATAW m_FindInfo;
175  HANDLE m_hContext;
176 #elif defined(__linux__)
177  cStringF m_sWildcardFilter;
178  public:
179  bool m_bReadStats;
180  private:
181  DIR* m_hContext;
182 #else
183 #error NOOS
184 #endif
185 
186  public:
187  explicit cFileFind(cStringF sDirPath = "", DWORD nFileFlags = 0) noexcept;
189  {
190  CloseContext();
191  }
192 
193  cStringF get_DirPath() const noexcept
194  {
195  return m_sDirPath;
196  }
197  cStringF GetFilePath(const FILECHAR_t* pszFileTitle) const
198  {
200  return cFilePath::CombineFilePathX(m_sDirPath, pszFileTitle);
201  }
203  {
206  return cFilePath::CombineFilePathX(m_sDirPath, m_FileEntry.m_sFileName);
207  }
208  bool isDots() const noexcept
209  {
210  return m_FileEntry.isDots();
211  }
212 
213  HRESULT FindOpen(const FILECHAR_t* pszDirPath = nullptr, const FILECHAR_t* pszWildcardFile = nullptr);
214  HRESULT FindFile(const FILECHAR_t* pszDirPath = nullptr, const FILECHAR_t* pszWildcardFile = nullptr);
215  HRESULT FindFileNext(bool bFirst = false);
216 
217  bool isContextOpen() const;
218  void CloseContext();
219  };
220 
222  {
227  public:
228  static const int k_FilesMax = 64 * 1024;
229  static const LOGCHAR_t k_szCantMoveFile[];
230 
232 
233  protected:
235 
236  protected:
238  {
240  if (!FileEntry.isDots())
241  {
242  m_aFiles.Add(FileEntry);
243  }
244  return S_OK;
245  }
246 
247  public:
248  explicit cFileDir(cStringF sDirPath = _FN(""))
249  : m_sDirPath(sDirPath)
250  {
251  }
252  virtual ~cFileDir()
253  {
254  }
255 
256  static HRESULT GRAYCALL RemoveDirectory1(const FILECHAR_t* pszDirName);
257  static HRESULT GRAYCALL CreateDirectory1(const FILECHAR_t* pszDirName);
258  static HRESULT GRAYCALL CreateDirectoryX(const FILECHAR_t* pszDirName);
259  static HRESULT GRAYCALL CreateDirForFileX(const FILECHAR_t* pszFilePath);
260  static HRESULT GRAYCALL MovePathToTrash(const FILECHAR_t* pszPath, bool bDir);
261 
262  static HRESULT GRAYCALL DirFileOp(FILEOP_TYPE eOp, const FILECHAR_t* pszDirSrc, const FILECHAR_t* pszDirDest, DWORD nFileFlags, cLogProcessor* pLog, IStreamProgressCallback* pProgress);
263  static HRESULT GRAYCALL MoveDirFiles(const FILECHAR_t* pszDirSrc, const FILECHAR_t* pszDirDest, cLogProcessor* pLog = nullptr, IStreamProgressCallback* pProgress = nullptr)
264  {
266  return DirFileOp(FILEOP_MOVE, pszDirSrc, pszDirDest, 0, pLog, pProgress);
267  }
268  static HRESULT GRAYCALL CopyDirFiles(const FILECHAR_t* pszDirSrc, const FILECHAR_t* pszDirDest, cLogProcessor* pLog = nullptr, IStreamProgressCallback* pProgress = nullptr)
269  {
271  return DirFileOp(FILEOP_COPY, pszDirSrc, pszDirDest, 0, pLog, pProgress);
272  }
273  static HRESULT GRAYCALL DeleteDirFiles(const FILECHAR_t* pszDirName, const FILECHAR_t* pszWildcardFile = nullptr, DWORD nFileFlags = 0)
274  {
279  return DirFileOp(FILEOP_DELETE, pszDirName, pszWildcardFile, nFileFlags, nullptr, nullptr);
280  }
281 
282  static HRESULT GRAYCALL DeletePathX(const FILECHAR_t* pszPath, DWORD nFileFlags = 0);
283 
285  {
286  return m_sDirPath;
287  }
288  void put_DirPath(cStringF sDirPath)
289  {
290  m_sDirPath = sDirPath;
291  // clear list only if changed?
292  RemoveAll();
293  }
295  {
296  return m_aFiles.GetSize();
297  }
299  {
300  return m_aFiles.ConstElementAt(i);
301  }
303  {
304  return m_aFiles.ElementAt(i);
305  }
307  {
309  ASSERT(m_aFiles.IsValidIndex(i));
310  const cFileFindEntry& rFileEntry = m_aFiles.ConstElementAt(i);
311  return rFileEntry.m_sFileName;
312  }
314  {
316  return GetFilePath(GetEnumTitleX(i));
317  }
318 
319  cStringF GetFilePath(const FILECHAR_t* pszTitle) const
320  {
322  return cFilePath::CombineFilePathX(m_sDirPath, pszTitle);
323  }
324  void RemoveAll()
325  {
327  m_aFiles.RemoveAll();
328  }
329 
330  HRESULT ReadDir(const FILECHAR_t* pszDirPath = nullptr, const FILECHAR_t* pszWildcardFile = nullptr, ITERATE_t iFilesMax = k_FilesMax, bool bFollowLink = false);
331 
332  HRESULT ReadDirAnyExt(const FILECHAR_t* pszFilePath, ITERATE_t iFilesMax = k_FilesMax);
333  HRESULT ReadDirPreferredExt(const FILECHAR_t* pszFilePath, const FILECHAR_t* const* pszExtTable);
334 
336  };
337 
338 #ifdef GRAY_DLL // force implementation/instantiate for DLL/SO.
342 #endif
343 
344 }
345 
346 #endif // _INC_cFileDir_H
#define _FN(x)
like _T(x) macro for static text file names.
Definition: FileName.h:23
#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
INT32 HRESULT
_WIN32 style error codes. INT32
Definition: SysTypes.h:465
#define ASSERT(exp)
Definition: cDebugAssert.h:87
FOF_TYPE_
Definition: cFileDir.h:24
@ FOF_X_UTF8
store file names as UTF8. even if USE_UNICODE.
Definition: cFileDir.h:38
@ FOF_X_WantDots
Definition: cFileDir.h:36
@ FOF_X_FollowLinks
Definition: cFileDir.h:35
#define UNITTEST2_PREDEF(x)
Definition: cUnitTestDecl.h:19
#define UNITTEST_FRIEND(n)
Define this in the class body to be unit tested. Allow the unit test to access private/protected stuf...
Definition: cUnitTestDecl.h:17
Definition: cArray.h:99
void RemoveAll()
Clean up.
Definition: cArray.h:230
TYPE & ElementAt(ITERATE_t nIndex)
Definition: cArray.h:167
ITERATE_t Add(ARG_TYPE newElement)
Definition: cArray.h:199
ITERATE_t GetSize() const noexcept
Definition: cArray.h:137
COMPARE_t CompareNoCase(const _TYPE_CH *pszStr) const
Definition: cString.h:269
Definition: cArray.h:932
Definition: cArray.h:437
REF_t ConstElementAt(ITERATE_t nIndex) const
Definition: cArray.h:534
bool IsValidIndex(ITERATE_t i) const noexcept
Definition: cArray.h:495
Definition: cFileDir.h:53
cStringF m_sVolumeName
can be empty.
Definition: cFileDir.h:60
FILESYS_TYPE get_FileSysType() const
Definition: cFileDir.h:73
FILESYS_TYPE m_eType
Enumerate known types for m_sTypeName (file system type)
Definition: cFileDir.h:62
bool m_bCaseSensitive
e.g. 0x03e700ff, FILE_CASE_SENSITIVE_SEARCH. else IgnoreCase
Definition: cFileDir.h:65
DWORD m_dwMaximumComponentLength
block size? e.g. 255 bytes
Definition: cFileDir.h:64
UINT64 m_nSerialNumber
Volume serial number (time stamp of last format) e.g. 0x0ca0e613 for _WIN32.
Definition: cFileDir.h:63
cStringF m_sTypeName
File system format/type e.g. "NTFS", "FAT".
Definition: cFileDir.h:61
Definition: cFileDir.h:222
cFileDir(cStringF sDirPath="")
Definition: cFileDir.h:248
ITERATE_t get_FileCount() const
Definition: cFileDir.h:294
cStringF GetFilePath(const FILECHAR_t *pszTitle) const
Definition: cFileDir.h:319
cStringF GetEnumPath(ITERATE_t i) const
Definition: cFileDir.h:313
void RemoveAll()
Definition: cFileDir.h:324
cStringF m_sDirPath
Does NOT include the wild card.
Definition: cFileDir.h:234
void put_DirPath(cStringF sDirPath)
Definition: cFileDir.h:288
virtual ~cFileDir()
Definition: cFileDir.h:252
static HRESULT __stdcall CopyDirFiles(const FILECHAR_t *pszDirSrc, const FILECHAR_t *pszDirDest, cLogProcessor *pLog=nullptr, IStreamProgressCallback *pProgress=nullptr)
Definition: cFileDir.h:268
cFileFindEntry & GetEnumFile(ITERATE_t i)
Definition: cFileDir.h:302
virtual HRESULT AddFileDirEntry(cFileFindEntry &FileEntry)
Definition: cFileDir.h:237
cStringF GetEnumTitleX(ITERATE_t i) const
Definition: cFileDir.h:306
cArrayStruct< cFileFindEntry > m_aFiles
Array of the files we found matching the ReadDir criteria.
Definition: cFileDir.h:231
static HRESULT __stdcall MoveDirFiles(const FILECHAR_t *pszDirSrc, const FILECHAR_t *pszDirDest, cLogProcessor *pLog=nullptr, IStreamProgressCallback *pProgress=nullptr)
Definition: cFileDir.h:263
const cFileFindEntry & GetEnumFile(ITERATE_t i) const
Definition: cFileDir.h:298
cStringF get_DirPath() const
Definition: cFileDir.h:284
static HRESULT __stdcall DeleteDirFiles(const FILECHAR_t *pszDirName, const FILECHAR_t *pszWildcardFile=nullptr, DWORD nFileFlags=0)
Definition: cFileDir.h:273
Definition: cFileDir.h:86
bool IsFileEqualTo(const THIS_t *pEntry) const
Definition: cFileDir.h:118
bool isDots() const noexcept
Definition: cFileDir.h:141
cFileFindEntry(const FILECHAR_t *pszFileName, const cFileStatus &status)
Definition: cFileDir.h:106
cStringF get_Name() const
Definition: cFileDir.h:154
cFileFindEntry()
Definition: cFileDir.h:97
cFileFindEntry(const FILECHAR_t *pszFileName)
Definition: cFileDir.h:101
bool isDot() const
Definition: cFileDir.h:133
bool IsFileEqualTo(const THIS_t &rEntry) const
Definition: cFileDir.h:111
cStringF m_sFileName
relative file title. (NOT FULL PATH) checks USE_UNICODE_FN and FILECHAR_t.
Definition: cFileDir.h:94
Definition: cFileDir.h:161
cStringF GetFilePath(const FILECHAR_t *pszFileTitle) const
Definition: cFileDir.h:197
cStringF get_DirPath() const noexcept
Definition: cFileDir.h:193
bool isDots() const noexcept
Definition: cFileDir.h:208
cStringF get_FilePath() const
Definition: cFileDir.h:202
cFileFindEntry m_FileEntry
The current entry. by calls to FindFile() and FindFileNext()
Definition: cFileDir.h:168
static cStringF __stdcall CombineFilePathX(const FILECHAR_t *pszBase, const FILECHAR_t *pszName, FILECHAR_t chSep=k_DirSep)
Definition: cFilePath.cpp:596
Definition: cFileStatus.h:58
Definition: cLogAppender.h:168
< The main namespace for all Core functions.
Definition: GrayCore.cpp:14
int ITERATE_t
like size_t but signed
Definition: Index.h:28
char FILECHAR_t
a UTF8 char in a file name. like TCHAR
Definition: FileName.h:22
char LOGCHAR_t
always just use UTF8 for logs, don't bother with UNICODE.
Definition: cLogLevel.h:17
FILEOP_TYPE
Definition: FileName.h:29
@ FILEOP_DELETE
Definition: FileName.h:35
@ FILEOP_COPY
Definition: FileName.h:34
@ FILEOP_MOVE
Definition: FileName.h:33
UINT64 FILE_SIZE_t
similar to STREAM_POS_t size_t
Definition: cFileStatus.h:31
bool operator!=(const cTimeDouble &dt1, const cTimeDouble &dt2)
Definition: cTimeDouble.h:254
bool operator==(const cTimeDouble &dt1, const cTimeDouble &dt2)
Definition: cTimeDouble.h:250
FILESYS_TYPE
Definition: cFilePath.h:22
@ FILESYS_QTY
Definition: cFilePath.h:32
Definition: cStreamProgress.h:168