105436638acc7c010349a69c3395f1a57c642dc62Ying Wang// Windows/FileFind.h 205436638acc7c010349a69c3395f1a57c642dc62Ying Wang 305436638acc7c010349a69c3395f1a57c642dc62Ying Wang#ifndef __WINDOWS_FILE_FIND_H 405436638acc7c010349a69c3395f1a57c642dc62Ying Wang#define __WINDOWS_FILE_FIND_H 505436638acc7c010349a69c3395f1a57c642dc62Ying Wang 605436638acc7c010349a69c3395f1a57c642dc62Ying Wang#include "../Common/MyString.h" 705436638acc7c010349a69c3395f1a57c642dc62Ying Wang#include "Defs.h" 805436638acc7c010349a69c3395f1a57c642dc62Ying Wang 905436638acc7c010349a69c3395f1a57c642dc62Ying Wangnamespace NWindows { 1005436638acc7c010349a69c3395f1a57c642dc62Ying Wangnamespace NFile { 1105436638acc7c010349a69c3395f1a57c642dc62Ying Wangnamespace NFind { 1205436638acc7c010349a69c3395f1a57c642dc62Ying Wang 1305436638acc7c010349a69c3395f1a57c642dc62Ying Wangnamespace NAttributes 1405436638acc7c010349a69c3395f1a57c642dc62Ying Wang{ 1505436638acc7c010349a69c3395f1a57c642dc62Ying Wang inline bool IsReadOnly(DWORD attrib) { return (attrib & FILE_ATTRIBUTE_READONLY) != 0; } 1605436638acc7c010349a69c3395f1a57c642dc62Ying Wang inline bool IsHidden(DWORD attrib) { return (attrib & FILE_ATTRIBUTE_HIDDEN) != 0; } 1705436638acc7c010349a69c3395f1a57c642dc62Ying Wang inline bool IsSystem(DWORD attrib) { return (attrib & FILE_ATTRIBUTE_SYSTEM) != 0; } 1805436638acc7c010349a69c3395f1a57c642dc62Ying Wang inline bool IsDir(DWORD attrib) { return (attrib & FILE_ATTRIBUTE_DIRECTORY) != 0; } 1905436638acc7c010349a69c3395f1a57c642dc62Ying Wang inline bool IsArchived(DWORD attrib) { return (attrib & FILE_ATTRIBUTE_ARCHIVE) != 0; } 2005436638acc7c010349a69c3395f1a57c642dc62Ying Wang inline bool IsCompressed(DWORD attrib) { return (attrib & FILE_ATTRIBUTE_COMPRESSED) != 0; } 2105436638acc7c010349a69c3395f1a57c642dc62Ying Wang inline bool IsEncrypted(DWORD attrib) { return (attrib & FILE_ATTRIBUTE_ENCRYPTED) != 0; } 2205436638acc7c010349a69c3395f1a57c642dc62Ying Wang} 2305436638acc7c010349a69c3395f1a57c642dc62Ying Wang 2405436638acc7c010349a69c3395f1a57c642dc62Ying Wangclass CFileInfoBase 2505436638acc7c010349a69c3395f1a57c642dc62Ying Wang{ 2605436638acc7c010349a69c3395f1a57c642dc62Ying Wang bool MatchesMask(UINT32 mask) const { return ((Attrib & mask) != 0); } 2705436638acc7c010349a69c3395f1a57c642dc62Ying Wangpublic: 2805436638acc7c010349a69c3395f1a57c642dc62Ying Wang UInt64 Size; 2905436638acc7c010349a69c3395f1a57c642dc62Ying Wang FILETIME CTime; 3005436638acc7c010349a69c3395f1a57c642dc62Ying Wang FILETIME ATime; 3105436638acc7c010349a69c3395f1a57c642dc62Ying Wang FILETIME MTime; 3205436638acc7c010349a69c3395f1a57c642dc62Ying Wang DWORD Attrib; 3305436638acc7c010349a69c3395f1a57c642dc62Ying Wang bool IsAltStream; 3405436638acc7c010349a69c3395f1a57c642dc62Ying Wang bool IsDevice; 3505436638acc7c010349a69c3395f1a57c642dc62Ying Wang 3605436638acc7c010349a69c3395f1a57c642dc62Ying Wang /* 3705436638acc7c010349a69c3395f1a57c642dc62Ying Wang #ifdef UNDER_CE 3805436638acc7c010349a69c3395f1a57c642dc62Ying Wang DWORD ObjectID; 3905436638acc7c010349a69c3395f1a57c642dc62Ying Wang #else 4005436638acc7c010349a69c3395f1a57c642dc62Ying Wang UINT32 ReparseTag; 4105436638acc7c010349a69c3395f1a57c642dc62Ying Wang #endif 4205436638acc7c010349a69c3395f1a57c642dc62Ying Wang */ 4305436638acc7c010349a69c3395f1a57c642dc62Ying Wang 4405436638acc7c010349a69c3395f1a57c642dc62Ying Wang CFileInfoBase() { Clear(); } 4505436638acc7c010349a69c3395f1a57c642dc62Ying Wang void Clear() throw(); 4605436638acc7c010349a69c3395f1a57c642dc62Ying Wang 4705436638acc7c010349a69c3395f1a57c642dc62Ying Wang void SetAsDir() { Attrib = FILE_ATTRIBUTE_DIRECTORY; } 4805436638acc7c010349a69c3395f1a57c642dc62Ying Wang 4905436638acc7c010349a69c3395f1a57c642dc62Ying Wang bool IsArchived() const { return MatchesMask(FILE_ATTRIBUTE_ARCHIVE); } 5005436638acc7c010349a69c3395f1a57c642dc62Ying Wang bool IsCompressed() const { return MatchesMask(FILE_ATTRIBUTE_COMPRESSED); } 5105436638acc7c010349a69c3395f1a57c642dc62Ying Wang bool IsDir() const { return MatchesMask(FILE_ATTRIBUTE_DIRECTORY); } 5205436638acc7c010349a69c3395f1a57c642dc62Ying Wang bool IsEncrypted() const { return MatchesMask(FILE_ATTRIBUTE_ENCRYPTED); } 5305436638acc7c010349a69c3395f1a57c642dc62Ying Wang bool IsHidden() const { return MatchesMask(FILE_ATTRIBUTE_HIDDEN); } 5405436638acc7c010349a69c3395f1a57c642dc62Ying Wang bool IsNormal() const { return MatchesMask(FILE_ATTRIBUTE_NORMAL); } 5505436638acc7c010349a69c3395f1a57c642dc62Ying Wang bool IsOffline() const { return MatchesMask(FILE_ATTRIBUTE_OFFLINE); } 5605436638acc7c010349a69c3395f1a57c642dc62Ying Wang bool IsReadOnly() const { return MatchesMask(FILE_ATTRIBUTE_READONLY); } 5705436638acc7c010349a69c3395f1a57c642dc62Ying Wang bool HasReparsePoint() const { return MatchesMask(FILE_ATTRIBUTE_REPARSE_POINT); } 5805436638acc7c010349a69c3395f1a57c642dc62Ying Wang bool IsSparse() const { return MatchesMask(FILE_ATTRIBUTE_SPARSE_FILE); } 5905436638acc7c010349a69c3395f1a57c642dc62Ying Wang bool IsSystem() const { return MatchesMask(FILE_ATTRIBUTE_SYSTEM); } 6005436638acc7c010349a69c3395f1a57c642dc62Ying Wang bool IsTemporary() const { return MatchesMask(FILE_ATTRIBUTE_TEMPORARY); } 6105436638acc7c010349a69c3395f1a57c642dc62Ying Wang}; 6205436638acc7c010349a69c3395f1a57c642dc62Ying Wang 6305436638acc7c010349a69c3395f1a57c642dc62Ying Wangstruct CFileInfo: public CFileInfoBase 6405436638acc7c010349a69c3395f1a57c642dc62Ying Wang{ 6505436638acc7c010349a69c3395f1a57c642dc62Ying Wang FString Name; 6605436638acc7c010349a69c3395f1a57c642dc62Ying Wang #if defined(_WIN32) && !defined(UNDER_CE) 6705436638acc7c010349a69c3395f1a57c642dc62Ying Wang // FString ShortName; 6805436638acc7c010349a69c3395f1a57c642dc62Ying Wang #endif 6905436638acc7c010349a69c3395f1a57c642dc62Ying Wang 7005436638acc7c010349a69c3395f1a57c642dc62Ying Wang bool IsDots() const throw(); 7105436638acc7c010349a69c3395f1a57c642dc62Ying Wang bool Find(CFSTR wildcard); 7205436638acc7c010349a69c3395f1a57c642dc62Ying Wang}; 7305436638acc7c010349a69c3395f1a57c642dc62Ying Wang 7405436638acc7c010349a69c3395f1a57c642dc62Ying Wangclass CFindFileBase 7505436638acc7c010349a69c3395f1a57c642dc62Ying Wang{ 7605436638acc7c010349a69c3395f1a57c642dc62Ying Wangprotected: 7705436638acc7c010349a69c3395f1a57c642dc62Ying Wang HANDLE _handle; 7805436638acc7c010349a69c3395f1a57c642dc62Ying Wangpublic: 7905436638acc7c010349a69c3395f1a57c642dc62Ying Wang bool IsHandleAllocated() const { return _handle != INVALID_HANDLE_VALUE; } 8005436638acc7c010349a69c3395f1a57c642dc62Ying Wang CFindFileBase(): _handle(INVALID_HANDLE_VALUE) {} 8105436638acc7c010349a69c3395f1a57c642dc62Ying Wang ~CFindFileBase() { Close(); } 8205436638acc7c010349a69c3395f1a57c642dc62Ying Wang bool Close() throw(); 8305436638acc7c010349a69c3395f1a57c642dc62Ying Wang}; 8405436638acc7c010349a69c3395f1a57c642dc62Ying Wang 8505436638acc7c010349a69c3395f1a57c642dc62Ying Wangclass CFindFile: public CFindFileBase 8605436638acc7c010349a69c3395f1a57c642dc62Ying Wang{ 8705436638acc7c010349a69c3395f1a57c642dc62Ying Wangpublic: 8805436638acc7c010349a69c3395f1a57c642dc62Ying Wang bool FindFirst(CFSTR wildcard, CFileInfo &fileInfo); 8905436638acc7c010349a69c3395f1a57c642dc62Ying Wang bool FindNext(CFileInfo &fileInfo); 9005436638acc7c010349a69c3395f1a57c642dc62Ying Wang}; 9105436638acc7c010349a69c3395f1a57c642dc62Ying Wang 9205436638acc7c010349a69c3395f1a57c642dc62Ying Wang#if defined(_WIN32) && !defined(UNDER_CE) 9305436638acc7c010349a69c3395f1a57c642dc62Ying Wang 9405436638acc7c010349a69c3395f1a57c642dc62Ying Wangstruct CStreamInfo 9505436638acc7c010349a69c3395f1a57c642dc62Ying Wang{ 9605436638acc7c010349a69c3395f1a57c642dc62Ying Wang UString Name; 9705436638acc7c010349a69c3395f1a57c642dc62Ying Wang UInt64 Size; 9805436638acc7c010349a69c3395f1a57c642dc62Ying Wang 9905436638acc7c010349a69c3395f1a57c642dc62Ying Wang UString GetReducedName() const; 10005436638acc7c010349a69c3395f1a57c642dc62Ying Wang bool IsMainStream() const throw(); 10105436638acc7c010349a69c3395f1a57c642dc62Ying Wang}; 10205436638acc7c010349a69c3395f1a57c642dc62Ying Wang 10305436638acc7c010349a69c3395f1a57c642dc62Ying Wangclass CFindStream: public CFindFileBase 10405436638acc7c010349a69c3395f1a57c642dc62Ying Wang{ 10505436638acc7c010349a69c3395f1a57c642dc62Ying Wangpublic: 10605436638acc7c010349a69c3395f1a57c642dc62Ying Wang bool FindFirst(CFSTR filePath, CStreamInfo &streamInfo); 10705436638acc7c010349a69c3395f1a57c642dc62Ying Wang bool FindNext(CStreamInfo &streamInfo); 10805436638acc7c010349a69c3395f1a57c642dc62Ying Wang}; 10905436638acc7c010349a69c3395f1a57c642dc62Ying Wang 11005436638acc7c010349a69c3395f1a57c642dc62Ying Wangclass CStreamEnumerator 11105436638acc7c010349a69c3395f1a57c642dc62Ying Wang{ 11205436638acc7c010349a69c3395f1a57c642dc62Ying Wang CFindStream _find; 11305436638acc7c010349a69c3395f1a57c642dc62Ying Wang FString _filePath; 11405436638acc7c010349a69c3395f1a57c642dc62Ying Wang 11505436638acc7c010349a69c3395f1a57c642dc62Ying Wang bool NextAny(CFileInfo &fileInfo); 11605436638acc7c010349a69c3395f1a57c642dc62Ying Wangpublic: 11705436638acc7c010349a69c3395f1a57c642dc62Ying Wang CStreamEnumerator(const FString &filePath): _filePath(filePath) {} 11805436638acc7c010349a69c3395f1a57c642dc62Ying Wang bool Next(CStreamInfo &streamInfo, bool &found); 11905436638acc7c010349a69c3395f1a57c642dc62Ying Wang}; 12005436638acc7c010349a69c3395f1a57c642dc62Ying Wang 12105436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif 12205436638acc7c010349a69c3395f1a57c642dc62Ying Wang 12305436638acc7c010349a69c3395f1a57c642dc62Ying Wangbool DoesFileExist(CFSTR name); 12405436638acc7c010349a69c3395f1a57c642dc62Ying Wangbool DoesDirExist(CFSTR name); 12505436638acc7c010349a69c3395f1a57c642dc62Ying Wangbool DoesFileOrDirExist(CFSTR name); 12605436638acc7c010349a69c3395f1a57c642dc62Ying Wang 12705436638acc7c010349a69c3395f1a57c642dc62Ying Wangclass CEnumerator 12805436638acc7c010349a69c3395f1a57c642dc62Ying Wang{ 12905436638acc7c010349a69c3395f1a57c642dc62Ying Wang CFindFile _findFile; 13005436638acc7c010349a69c3395f1a57c642dc62Ying Wang FString _wildcard; 13105436638acc7c010349a69c3395f1a57c642dc62Ying Wang 13205436638acc7c010349a69c3395f1a57c642dc62Ying Wang bool NextAny(CFileInfo &fileInfo); 13305436638acc7c010349a69c3395f1a57c642dc62Ying Wangpublic: 13405436638acc7c010349a69c3395f1a57c642dc62Ying Wang CEnumerator(const FString &wildcard): _wildcard(wildcard) {} 13505436638acc7c010349a69c3395f1a57c642dc62Ying Wang bool Next(CFileInfo &fileInfo); 136 bool Next(CFileInfo &fileInfo, bool &found); 137}; 138 139class CFindChangeNotification 140{ 141 HANDLE _handle; 142public: 143 operator HANDLE () { return _handle; } 144 bool IsHandleAllocated() const { return _handle != INVALID_HANDLE_VALUE && _handle != 0; } 145 CFindChangeNotification(): _handle(INVALID_HANDLE_VALUE) {} 146 ~CFindChangeNotification() { Close(); } 147 bool Close() throw(); 148 HANDLE FindFirst(CFSTR pathName, bool watchSubtree, DWORD notifyFilter); 149 bool FindNext() { return BOOLToBool(::FindNextChangeNotification(_handle)); } 150}; 151 152#ifndef UNDER_CE 153bool MyGetLogicalDriveStrings(CObjectVector<FString> &driveStrings); 154#endif 155 156}}} 157 158#endif 159