Home | History | Annotate | Download | only in Windows
      1 // Windows/FileFind.h
      2 
      3 #ifndef __WINDOWS_FILEFIND_H
      4 #define __WINDOWS_FILEFIND_H
      5 
      6 #include "../Common/MyString.h"
      7 #include "../Common/Types.h"
      8 #include "Defs.h"
      9 #include "FileName.h"
     10 
     11 namespace NWindows {
     12 namespace NFile {
     13 namespace NFind {
     14 
     15 namespace NAttributes
     16 {
     17   inline bool IsReadOnly(DWORD attrib) { return (attrib & FILE_ATTRIBUTE_READONLY) != 0; }
     18   inline bool IsHidden(DWORD attrib) { return (attrib & FILE_ATTRIBUTE_HIDDEN) != 0; }
     19   inline bool IsSystem(DWORD attrib) { return (attrib & FILE_ATTRIBUTE_SYSTEM) != 0; }
     20   inline bool IsDir(DWORD attrib) { return (attrib & FILE_ATTRIBUTE_DIRECTORY) != 0; }
     21   inline bool IsArchived(DWORD attrib) { return (attrib & FILE_ATTRIBUTE_ARCHIVE) != 0; }
     22   inline bool IsCompressed(DWORD attrib) { return (attrib & FILE_ATTRIBUTE_COMPRESSED) != 0; }
     23   inline bool IsEncrypted(DWORD attrib) { return (attrib & FILE_ATTRIBUTE_ENCRYPTED) != 0; }
     24 }
     25 
     26 class CFileInfoBase
     27 {
     28   bool MatchesMask(UINT32 mask) const { return ((Attrib & mask) != 0); }
     29 protected:
     30   void Clear();
     31 public:
     32   UInt64 Size;
     33   FILETIME CTime;
     34   FILETIME ATime;
     35   FILETIME MTime;
     36   DWORD Attrib;
     37   bool IsDevice;
     38 
     39   /*
     40   #ifdef UNDER_CE
     41   DWORD ObjectID;
     42   #else
     43   UINT32 ReparseTag;
     44   #endif
     45   */
     46 
     47   bool IsArchived() const { return MatchesMask(FILE_ATTRIBUTE_ARCHIVE); }
     48   bool IsCompressed() const { return MatchesMask(FILE_ATTRIBUTE_COMPRESSED); }
     49   bool IsDir() const { return MatchesMask(FILE_ATTRIBUTE_DIRECTORY); }
     50   bool IsEncrypted() const { return MatchesMask(FILE_ATTRIBUTE_ENCRYPTED); }
     51   bool IsHidden() const { return MatchesMask(FILE_ATTRIBUTE_HIDDEN); }
     52   bool IsNormal() const { return MatchesMask(FILE_ATTRIBUTE_NORMAL); }
     53   bool IsOffline() const { return MatchesMask(FILE_ATTRIBUTE_OFFLINE); }
     54   bool IsReadOnly() const { return MatchesMask(FILE_ATTRIBUTE_READONLY); }
     55   bool HasReparsePoint() const { return MatchesMask(FILE_ATTRIBUTE_REPARSE_POINT); }
     56   bool IsSparse() const { return MatchesMask(FILE_ATTRIBUTE_SPARSE_FILE); }
     57   bool IsSystem() const { return MatchesMask(FILE_ATTRIBUTE_SYSTEM); }
     58   bool IsTemporary() const { return MatchesMask(FILE_ATTRIBUTE_TEMPORARY); }
     59 };
     60 
     61 struct CFileInfo: public CFileInfoBase
     62 {
     63   CSysString Name;
     64 
     65   bool IsDots() const;
     66   bool Find(LPCTSTR wildcard);
     67 };
     68 
     69 #ifdef _UNICODE
     70 typedef CFileInfo CFileInfoW;
     71 #else
     72 struct CFileInfoW: public CFileInfoBase
     73 {
     74   UString Name;
     75 
     76   bool IsDots() const;
     77   bool Find(LPCWSTR wildcard);
     78 };
     79 #endif
     80 
     81 class CFindFile
     82 {
     83   friend class CEnumerator;
     84   HANDLE _handle;
     85 public:
     86   bool IsHandleAllocated() const { return _handle != INVALID_HANDLE_VALUE; }
     87   CFindFile(): _handle(INVALID_HANDLE_VALUE) {}
     88   ~CFindFile() {  Close(); }
     89   bool FindFirst(LPCTSTR wildcard, CFileInfo &fileInfo);
     90   bool FindNext(CFileInfo &fileInfo);
     91   #ifndef _UNICODE
     92   bool FindFirst(LPCWSTR wildcard, CFileInfoW &fileInfo);
     93   bool FindNext(CFileInfoW &fileInfo);
     94   #endif
     95   bool Close();
     96 };
     97 
     98 bool DoesFileExist(LPCTSTR name);
     99 bool DoesDirExist(LPCTSTR name);
    100 bool DoesFileOrDirExist(LPCTSTR name);
    101 #ifndef _UNICODE
    102 bool DoesFileExist(LPCWSTR name);
    103 bool DoesDirExist(LPCWSTR name);
    104 bool DoesFileOrDirExist(LPCWSTR name);
    105 #endif
    106 
    107 class CEnumerator
    108 {
    109   CFindFile _findFile;
    110   CSysString _wildcard;
    111   bool NextAny(CFileInfo &fileInfo);
    112 public:
    113   CEnumerator(): _wildcard(NName::kAnyStringWildcard) {}
    114   CEnumerator(const CSysString &wildcard): _wildcard(wildcard) {}
    115   bool Next(CFileInfo &fileInfo);
    116   bool Next(CFileInfo &fileInfo, bool &found);
    117 };
    118 
    119 #ifdef _UNICODE
    120 typedef CEnumerator CEnumeratorW;
    121 #else
    122 class CEnumeratorW
    123 {
    124   CFindFile _findFile;
    125   UString _wildcard;
    126   bool NextAny(CFileInfoW &fileInfo);
    127 public:
    128   CEnumeratorW(): _wildcard(NName::kAnyStringWildcard) {}
    129   CEnumeratorW(const UString &wildcard): _wildcard(wildcard) {}
    130   bool Next(CFileInfoW &fileInfo);
    131   bool Next(CFileInfoW &fileInfo, bool &found);
    132 };
    133 #endif
    134 
    135 class CFindChangeNotification
    136 {
    137   HANDLE _handle;
    138 public:
    139   operator HANDLE () { return _handle; }
    140   bool IsHandleAllocated() const { return _handle != INVALID_HANDLE_VALUE && _handle != 0; }
    141   CFindChangeNotification(): _handle(INVALID_HANDLE_VALUE) {}
    142   ~CFindChangeNotification() { Close(); }
    143   bool Close();
    144   HANDLE FindFirst(LPCTSTR pathName, bool watchSubtree, DWORD notifyFilter);
    145   #ifndef _UNICODE
    146   HANDLE FindFirst(LPCWSTR pathName, bool watchSubtree, DWORD notifyFilter);
    147   #endif
    148   bool FindNext() { return BOOLToBool(::FindNextChangeNotification(_handle)); }
    149 };
    150 
    151 #ifndef UNDER_CE
    152 bool MyGetLogicalDriveStrings(CSysStringVector &driveStrings);
    153 #ifndef _UNICODE
    154 bool MyGetLogicalDriveStrings(UStringVector &driveStrings);
    155 #endif
    156 #endif
    157 
    158 }}}
    159 
    160 #endif
    161 
    162