aboutsummaryrefslogtreecommitdiff
path: root/dep/CascLib/src/common/Directory.cpp
blob: cef7dfa6319615c8f2154737f7627df504a80fe0 (plain)
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;
}