1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
|
/*****************************************************************************/
/* Directory.cpp Copyright (c) Ladislav Zezula 2014 */
/*---------------------------------------------------------------------------*/
/* System-dependent directory functions for CascLib */
/*---------------------------------------------------------------------------*/
/* Date Ver Who Comment */
/* -------- ---- --- ------- */
/* 29.04.14 1.00 Lad The first version of Directory.cpp */
/*****************************************************************************/
#define __CASCLIB_SELF__
#include "../CascLib.h"
#include "../CascCommon.h"
//-----------------------------------------------------------------------------
// Public functions
bool DirectoryExists(LPCTSTR szDirectory)
{
#ifdef CASCLIB_PLATFORM_WINDOWS
DWORD dwAttributes = GetFileAttributes(szDirectory);
if((dwAttributes != INVALID_FILE_ATTRIBUTES) && (dwAttributes & FILE_ATTRIBUTE_DIRECTORY))
return true;
#else // CASCLIB_PLATFORM_WINDOWS
DIR * dir = opendir(szDirectory);
if(dir != NULL)
{
closedir(dir);
return true;
}
#endif
return false;
}
bool MakeDirectory(LPCTSTR szDirectory)
{
#ifdef CASCLIB_PLATFORM_WINDOWS
BOOL bResult = CreateDirectory(szDirectory, NULL);
return (bResult) ? true : false;
#else
return (mkdir(szDirectory, 0755) == 0);
#endif
}
DWORD ScanDirectory(
LPCTSTR szDirectory,
DIRECTORY_CALLBACK PfnFolderCallback,
DIRECTORY_CALLBACK PfnFileCallback,
void * pvContext)
{
#ifdef CASCLIB_PLATFORM_WINDOWS
CASC_PATH<TCHAR> SearchMask(szDirectory, _T("*"), NULL);
WIN32_FIND_DATA wf;
HANDLE hFind;
// Prepare directory search
hFind = FindFirstFile(SearchMask, &wf);
if(hFind != INVALID_HANDLE_VALUE)
{
// Skip the first file as it's always just "." or ".."
while(FindNextFile(hFind, &wf))
{
// If we found a folder, we call the directory callback
if(wf.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
if(PfnFolderCallback != NULL)
{
if(!PfnFolderCallback(wf.cFileName, pvContext))
break;
}
}
else
{
if(PfnFileCallback != NULL)
{
if(!PfnFileCallback(wf.cFileName, pvContext))
break;
}
}
}
// Close the search handle
FindClose(hFind);
return ERROR_SUCCESS;
}
#else // CASCLIB_PLATFORM_WINDOWS
struct dirent * dir_entry;
DIR * dir;
// Prepare directory search
if((dir = opendir(szDirectory)) != NULL)
{
// Read (the next) directory entry
while((dir_entry = readdir(dir)) != NULL)
{
if(dir_entry->d_type == DT_DIR)
{
if(PfnFolderCallback != NULL)
{
if(!PfnFolderCallback(dir_entry->d_name, pvContext))
{
break;
}
}
}
else
{
if(PfnFileCallback != NULL)
{
if(!PfnFileCallback(dir_entry->d_name, pvContext))
{
break;
}
}
}
}
closedir(dir);
return ERROR_SUCCESS;
}
#endif
return ERROR_PATH_NOT_FOUND;
}
|