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