9 hFind=INVALID_HANDLE_VALUE;
19 if (hFind!=INVALID_HANDLE_VALUE)
28 void FindFile::SetMask(const char *FindMask)
30 strcpy(FindFile::FindMask,FindMask);
32 CharToWide(FindMask,FindMaskW);
37 void FindFile::SetMaskW(const wchar *FindMaskW)
41 strcpyw(FindFile::FindMaskW,FindMaskW);
43 WideToChar(FindMaskW,FindMask);
48 bool FindFile::Next(struct FindData *fd,bool GetSymLink)
56 if ((hFind=Win32Find(INVALID_HANDLE_VALUE,FindMask,FindMaskW,fd))==INVALID_HANDLE_VALUE)
60 if (Win32Find(hFind,FindMask,FindMaskW,fd)==INVALID_HANDLE_VALUE)
66 strcpy(DirName,FindMask);
67 RemoveNameFromPath(DirName);
73 int Length=strlen(DirName);
74 if (Length>1 && DirName[Length-1]==CPATHDIVIDER && (Length!=3 || !IsDriveDiv(DirName[1])))
78 if ((dirp=opendir(DirName))==NULL)
80 fd->Error=(errno!=ENOENT);
86 struct dirent *ent=readdir(dirp);
89 if (strcmp(ent->d_name,".")==0 || strcmp(ent->d_name,"..")==0)
91 if (CmpName(FindMask,ent->d_name,MATCH_NAMES))
94 strcpy(FullName,FindMask);
95 strcpy(PointToName(FullName),ent->d_name);
96 if (!FastFind(FullName,NULL,fd,GetSymLink))
98 ErrHandler.OpenErrorMsg(FullName);
101 strcpy(fd->Name,FullName);
107 if (!LowAscii(fd->Name))
108 UtfToWide(fd->Name,fd->NameW,sizeof(fd->NameW));
109 #elif defined(UNICODE_SUPPORTED)
110 if (!LowAscii(fd->Name) && UnicodeEnabled())
111 CharToWide(fd->Name,fd->NameW);
114 fd->IsDir=IsDir(fd->FileAttr);
116 char *Name=PointToName(fd->Name);
117 if (strcmp(Name,".")==0 || strcmp(Name,"..")==0)
123 bool FindFile::FastFind(const char *FindMask,const wchar *FindMaskW,struct FindData *fd,bool GetSymLink)
127 if (IsWildcard(FindMask,FindMaskW))
131 HANDLE hFind=Win32Find(INVALID_HANDLE_VALUE,FindMask,FindMaskW,fd);
132 if (hFind==INVALID_HANDLE_VALUE)
140 if (lstat(FindMask,&st)!=0)
142 if (stat(FindMask,&st)!=0)
145 fd->Error=(errno!=ENOENT);
150 if (stat(FindMask,&st)!=0)
152 fd->Error=(errno!=ENOENT);
156 fd->FileAttr=chmod(FindMask,0);
158 fd->FileAttr=st.st_attr;
160 fd->FileAttr=st.st_mode;
162 fd->IsDir=IsDir(st.st_mode);
164 fd->mtime=st.st_mtime;
165 fd->atime=st.st_atime;
166 fd->ctime=st.st_ctime;
167 fd->FileTime=fd->mtime.GetDos();
168 strcpy(fd->Name,FindMask);
171 if (!LowAscii(fd->Name))
172 UtfToWide(fd->Name,fd->NameW,sizeof(fd->NameW));
173 #elif defined(UNICODE_SUPPORTED)
174 if (!LowAscii(fd->Name) && UnicodeEnabled())
175 CharToWide(fd->Name,fd->NameW);
178 fd->IsDir=IsDir(fd->FileAttr);
184 HANDLE FindFile::Win32Find(HANDLE hFind,const char *Mask,const wchar *MaskW,struct FindData *fd)
186 #if !defined(TARGET_POSIX)
192 if (MaskW!=NULL && *MaskW!=0)
193 strcpyw(WideMask,MaskW);
195 CharToWide(Mask,WideMask);
197 WIN32_FIND_DATAW FindData;
198 if (hFind==INVALID_HANDLE_VALUE)
200 hFind=FindFirstFileW(WideMask,&FindData);
201 if (hFind==INVALID_HANDLE_VALUE)
203 int SysErr=GetLastError();
204 fd->Error=(SysErr!=ERROR_FILE_NOT_FOUND &&
205 SysErr!=ERROR_PATH_NOT_FOUND &&
206 SysErr!=ERROR_NO_MORE_FILES);
210 if (!FindNextFileW(hFind,&FindData))
212 hFind=INVALID_HANDLE_VALUE;
213 fd->Error=GetLastError()!=ERROR_NO_MORE_FILES;
216 if (hFind!=INVALID_HANDLE_VALUE)
218 strcpyw(fd->NameW,WideMask);
219 strcpyw(PointToName(fd->NameW),FindData.cFileName);
220 WideToChar(fd->NameW,fd->Name);
221 fd->Size=int32to64(FindData.nFileSizeHigh,FindData.nFileSizeLow);
222 fd->FileAttr=FindData.dwFileAttributes;
223 WideToChar(FindData.cAlternateFileName,fd->ShortName);
224 fd->ftCreationTime=FindData.ftCreationTime;
225 fd->ftLastAccessTime=FindData.ftLastAccessTime;
226 fd->ftLastWriteTime=FindData.ftLastWriteTime;
227 fd->mtime=FindData.ftLastWriteTime;
228 fd->ctime=FindData.ftCreationTime;
229 fd->atime=FindData.ftLastAccessTime;
230 fd->FileTime=fd->mtime.GetDos();
233 if (LowAscii(fd->NameW))
243 if (Mask!=NULL && *Mask!=0)
244 strcpy(CharMask,Mask);
246 WideToChar(MaskW,CharMask);
248 WIN32_FIND_DATA FindData;
249 if (hFind==INVALID_HANDLE_VALUE)
251 hFind=FindFirstFile(CharMask,&FindData);
252 if (hFind==INVALID_HANDLE_VALUE)
254 int SysErr=GetLastError();
255 fd->Error=SysErr!=ERROR_FILE_NOT_FOUND && SysErr!=ERROR_PATH_NOT_FOUND;
259 if (!FindNextFile(hFind,&FindData))
261 hFind=INVALID_HANDLE_VALUE;
262 fd->Error=GetLastError()!=ERROR_NO_MORE_FILES;
265 if (hFind!=INVALID_HANDLE_VALUE)
267 strcpy(fd->Name,CharMask);
268 strcpy(PointToName(fd->Name),FindData.cFileName);
269 CharToWide(fd->Name,fd->NameW);
270 fd->Size=int32to64(FindData.nFileSizeHigh,FindData.nFileSizeLow);
271 fd->FileAttr=FindData.dwFileAttributes;
272 strcpy(fd->ShortName,FindData.cAlternateFileName);
273 fd->ftCreationTime=FindData.ftCreationTime;
274 fd->ftLastAccessTime=FindData.ftLastAccessTime;
275 fd->ftLastWriteTime=FindData.ftLastWriteTime;
276 fd->mtime=FindData.ftLastWriteTime;
277 fd->ctime=FindData.ftCreationTime;
278 fd->atime=FindData.ftLastAccessTime;
279 fd->FileTime=fd->mtime.GetDos();
280 if (LowAscii(fd->Name))