ISXMr/libs/isxdk/include/FileList.h

237 lines
5.1 KiB
C++

#pragma once
struct _FileListEntry
{
char Filename[512];
char FilenameOnly[128];
FILETIME ftCreationTime;
FILETIME ftLastWriteTime;
FILETIME ftLastAccessTime;
unsigned int FileSize;
};
class CFileList
{
public:
CFileList()
{
nFiles=0;
}
~CFileList()
{
List.Cleanup();
}
void AddFile(LPWIN32_FIND_DATA pFile, char *Path)
{
_FileListEntry *pNew = new _FileListEntry;
sprintf(pNew->Filename,"%s%s",Path,pFile->cFileName);
strcpy(pNew->FilenameOnly,pFile->cFileName);
pNew->ftCreationTime=pFile->ftCreationTime;
pNew->ftLastAccessTime=pFile->ftLastAccessTime;
pNew->ftLastWriteTime=pFile->ftLastWriteTime;
pNew->FileSize=pFile->nFileSizeLow;
List+=pNew;
nFiles++;
}
char *GetPath(char *Wildcard)
{
static char Path[512];
if (char *pSlash=strrchr(Wildcard,'\\'))
{
strcpy(Path,Wildcard);
Path[(pSlash-Wildcard)+1]=0;
}
else
Path[0]=0;
return Path;
}
unsigned int EnumDirectories(char *Wildcard)
{
WIN32_FIND_DATA file;
HANDLE hSearch=FindFirstFile(Wildcard,&file);
if (hSearch==INVALID_HANDLE_VALUE)
return 0;
char *Path=GetPath(Wildcard);
do
{
if (_stricmp(file.cFileName,".") && _stricmp(file.cFileName,".."))
if (file.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)
AddFile(&file,Path);
} while (FindNextFile(hSearch,&file));
FindClose(hSearch);
return nFiles;
}
unsigned int EnumFiles(char *Wildcard)
{
WIN32_FIND_DATA file;
HANDLE hSearch=FindFirstFile(Wildcard,&file);
if (hSearch==INVALID_HANDLE_VALUE)
return 0;
char *Path=GetPath(Wildcard);
do
{
if (!(file.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY))
AddFile(&file,Path);
} while (FindNextFile(hSearch,&file));
FindClose(hSearch);
return nFiles;
}
unsigned int EnumFilesAfter(FILETIME &filetime, char *Wildcard)
{
WIN32_FIND_DATA file;
HANDLE hSearch=FindFirstFile(Wildcard,&file);
if (hSearch==INVALID_HANDLE_VALUE)
return 0;
char *Path=GetPath(Wildcard);
do
{
if (!(file.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY) &&
CompareFileTime(&file.ftLastWriteTime,&filetime)>0)
{
AddFile(&file,Path);
}
} while (FindNextFile(hSearch,&file));
FindClose(hSearch);
return nFiles;
}
unsigned int nFiles;
CIndex <_FileListEntry *> List;
};
struct _FileListEntryW
{
wchar_t Filename[512];
wchar_t FilenameOnly[128];
FILETIME ftCreationTime;
FILETIME ftLastWriteTime;
FILETIME ftLastAccessTime;
unsigned int FileSize;
};
class CFileListW
{
public:
CFileListW()
{
nFiles=0;
}
~CFileListW()
{
List.Cleanup();
}
void Clear()
{
List.Cleanup();
nFiles=0;
}
void AddFile(PWIN32_FIND_DATAW pFile, wchar_t *Path)
{
_FileListEntryW *pNew = new _FileListEntryW;
_snwprintf(pNew->Filename,512,L"%ls%ls",Path,pFile->cFileName);
wcsncpy(pNew->FilenameOnly,pFile->cFileName,sizeof(pNew->FilenameOnly)/sizeof(pNew->FilenameOnly[0]));
pNew->ftCreationTime=pFile->ftCreationTime;
pNew->ftLastAccessTime=pFile->ftLastAccessTime;
pNew->ftLastWriteTime=pFile->ftLastWriteTime;
pNew->FileSize=pFile->nFileSizeLow;
List+=pNew;
nFiles++;
}
inline wchar_t *ConvertSlashes(wchar_t *text)
{
wchar_t *temp=text;
while(wchar_t *pSlash=wcschr(temp,'\\'))
{
*pSlash='/';
temp=&pSlash[1];
}
return text;
}
wchar_t *GetPath(const wchar_t *Wildcard)
{
static wchar_t Path[512];
wchar_t temp[512];
wcsncpy(temp,Wildcard,512);
temp[511]=0;
wchar_t *pLastSlash=wcsrchr(temp,'\\');
if (pLastSlash)
{
wchar_t *pOtherSlash=wcsrchr(pLastSlash,'/');
if (pOtherSlash && pOtherSlash>pLastSlash)
pLastSlash=pOtherSlash;
}
else
pLastSlash=wcsrchr(temp,'/');
if (wchar_t *pSlash=pLastSlash)
{
wcsncpy(Path,temp,sizeof(Path)/sizeof(Path[0]));
Path[(pSlash-temp)+1]=0;
ConvertSlashes(Path);
}
else
Path[0]=0;
return Path;
}
unsigned int EnumDirectories(const wchar_t *Wildcard)
{
WIN32_FIND_DATAW file;
HANDLE hSearch=FindFirstFileW(Wildcard,&file);
if (hSearch==INVALID_HANDLE_VALUE)
return 0;
wchar_t *Path=GetPath(Wildcard);
do
{
if (wcsicmp(file.cFileName,L".") && wcsicmp(file.cFileName,L".."))
if (file.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)
AddFile(&file,Path);
} while (FindNextFileW(hSearch,&file));
FindClose(hSearch);
return nFiles;
}
unsigned int EnumFiles(const wchar_t *Wildcard)
{
WIN32_FIND_DATAW file;
HANDLE hSearch=FindFirstFileW(Wildcard,&file);
if (hSearch==INVALID_HANDLE_VALUE)
return 0;
wchar_t *Path=GetPath(Wildcard);
do
{
if (!(file.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY))
AddFile(&file,Path);
} while (FindNextFileW(hSearch,&file));
FindClose(hSearch);
return nFiles;
}
unsigned int EnumFilesAfter(FILETIME &filetime, const wchar_t *Wildcard)
{
WIN32_FIND_DATAW file;
HANDLE hSearch=FindFirstFileW(Wildcard,&file);
if (hSearch==INVALID_HANDLE_VALUE)
return 0;
wchar_t *Path=GetPath(Wildcard);
do
{
if (!(file.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY) &&
CompareFileTime(&file.ftLastWriteTime,&filetime)>0)
{
AddFile(&file,Path);
}
} while (FindNextFileW(hSearch,&file));
FindClose(hSearch);
return nFiles;
}
unsigned int nFiles;
CIndex <_FileListEntryW *> List;
};