|
ds@1952
|
1 |
#include "CFileList.h" |
|
ds@1952
|
2 |
#include "InstallerUtil.h" |
|
ds@1952
|
3 |
|
|
ds@1952
|
4 |
using namespace std; |
|
ds@1952
|
5 |
|
|
ds@1952
|
6 |
CFileList::CFileList(const TCHAR *name) : m_TotalSize(0), m_RecursiveSize(0), |
|
ds@1952
|
7 |
m_bGotRecursiveSize(false) |
|
ds@1952
|
8 |
{ |
|
ds@1952
|
9 |
UTIL_Format(m_FolderName, sizeof(m_FolderName) / sizeof(TCHAR), _T("%s"), name); |
|
ds@1952
|
10 |
} |
|
ds@1952
|
11 |
|
|
ds@1952
|
12 |
CFileList::~CFileList() |
|
ds@1952
|
13 |
{ |
|
ds@1952
|
14 |
list<CFileList *>::iterator iter; |
|
ds@1952
|
15 |
|
|
ds@1952
|
16 |
for (iter = m_folder_list.begin(); |
|
ds@1952
|
17 |
iter != m_folder_list.end(); |
|
ds@1952
|
18 |
iter++) |
|
ds@1952
|
19 |
{ |
|
ds@1952
|
20 |
delete (*iter); |
|
ds@1952
|
21 |
} |
|
ds@1952
|
22 |
} |
|
ds@1952
|
23 |
|
|
ds@1952
|
24 |
const TCHAR *CFileList::GetFolderName() |
|
ds@1952
|
25 |
{ |
|
ds@1952
|
26 |
return m_FolderName; |
|
ds@1952
|
27 |
} |
|
ds@1952
|
28 |
|
|
ds@1952
|
29 |
void CFileList::AddFolder(CFileList *pFileList) |
|
ds@1952
|
30 |
{ |
|
ds@1952
|
31 |
m_folder_list.push_back(pFileList); |
|
ds@1952
|
32 |
} |
|
ds@1952
|
33 |
|
|
ds@1952
|
34 |
void CFileList::AddFile(const TCHAR *name, unsigned __int64 size) |
|
ds@1952
|
35 |
{ |
|
ds@1952
|
36 |
CFileListEntry entry; |
|
ds@1952
|
37 |
|
|
ds@1952
|
38 |
UTIL_Format(entry.file, sizeof(entry.file) / sizeof(TCHAR), _T("%s"), name); |
|
ds@1952
|
39 |
entry.size = size; |
|
ds@1952
|
40 |
|
|
ds@1952
|
41 |
m_file_list.push_back(entry); |
|
ds@1952
|
42 |
m_TotalSize += size; |
|
ds@1952
|
43 |
} |
|
ds@1952
|
44 |
|
|
ds@1952
|
45 |
unsigned __int64 CFileList::GetRecursiveSize() |
|
ds@1952
|
46 |
{ |
|
ds@1952
|
47 |
if (m_bGotRecursiveSize) |
|
ds@1952
|
48 |
{ |
|
ds@1952
|
49 |
return m_RecursiveSize; |
|
ds@1952
|
50 |
} |
|
ds@1952
|
51 |
|
|
ds@1952
|
52 |
m_RecursiveSize = m_TotalSize; |
|
ds@1952
|
53 |
|
|
ds@1952
|
54 |
list<CFileList *>::iterator iter; |
|
ds@1952
|
55 |
for (iter = m_folder_list.begin(); iter != m_folder_list.end(); iter++) |
|
ds@1952
|
56 |
{ |
|
ds@1952
|
57 |
m_RecursiveSize += (*iter)->GetRecursiveSize(); |
|
ds@1952
|
58 |
} |
|
ds@1952
|
59 |
|
|
ds@1952
|
60 |
m_bGotRecursiveSize = true; |
|
ds@1952
|
61 |
|
|
ds@1952
|
62 |
return m_RecursiveSize; |
|
ds@1952
|
63 |
} |
|
ds@1952
|
64 |
|
|
ds@1952
|
65 |
const TCHAR *CFileList::PeekCurrentFile() |
|
ds@1952
|
66 |
{ |
|
ds@1952
|
67 |
if (m_file_list.empty()) |
|
ds@1952
|
68 |
{ |
|
ds@1952
|
69 |
return NULL; |
|
ds@1952
|
70 |
} |
|
ds@1952
|
71 |
|
|
ds@1952
|
72 |
return m_file_list.begin()->file; |
|
ds@1952
|
73 |
} |
|
ds@1952
|
74 |
|
|
ds@1952
|
75 |
void CFileList::PopCurrentFile() |
|
ds@1952
|
76 |
{ |
|
ds@1952
|
77 |
m_file_list.erase(m_file_list.begin()); |
|
ds@1952
|
78 |
} |
|
ds@1952
|
79 |
|
|
ds@1952
|
80 |
CFileList *CFileList::PeekCurrentFolder() |
|
ds@1952
|
81 |
{ |
|
ds@1952
|
82 |
if (m_folder_list.empty()) |
|
ds@1952
|
83 |
{ |
|
ds@1952
|
84 |
return NULL; |
|
ds@1952
|
85 |
} |
|
ds@1952
|
86 |
|
|
ds@1952
|
87 |
return *(m_folder_list.begin()); |
|
ds@1952
|
88 |
} |
|
ds@1952
|
89 |
|
|
ds@1952
|
90 |
void CFileList::PopCurrentFolder() |
|
ds@1952
|
91 |
{ |
|
ds@1952
|
92 |
m_folder_list.erase(m_folder_list.begin()); |
|
ds@1952
|
93 |
} |
|
ds@1952
|
94 |
|
|
ds@1952
|
95 |
void RecursiveBuildFileList(CFileList *file_list, const TCHAR *current_folder) |
|
ds@1952
|
96 |
{ |
|
ds@1952
|
97 |
HANDLE hFind; |
|
ds@1952
|
98 |
WIN32_FIND_DATA fd; |
|
ds@1952
|
99 |
TCHAR path[MAX_PATH]; |
|
ds@1952
|
100 |
|
|
ds@1952
|
101 |
UTIL_PathFormat(path, sizeof(path) / sizeof(TCHAR), _T("%s\\*.*"), current_folder); |
|
ds@1952
|
102 |
|
|
ds@1952
|
103 |
if ((hFind = FindFirstFile(path, &fd)) == INVALID_HANDLE_VALUE) |
|
ds@1952
|
104 |
{ |
|
ds@1952
|
105 |
return; |
|
ds@1952
|
106 |
} |
|
ds@1952
|
107 |
|
|
ds@1952
|
108 |
do |
|
ds@1952
|
109 |
{ |
|
ds@1952
|
110 |
if (tstrcasecmp(fd.cFileName, _T(".")) == 0 |
|
ds@1952
|
111 |
|| tstrcasecmp(fd.cFileName, _T("..")) == 0) |
|
ds@1952
|
112 |
{ |
|
ds@1952
|
113 |
continue; |
|
ds@1952
|
114 |
} |
|
ds@1952
|
115 |
|
|
ds@1952
|
116 |
if ((fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == FILE_ATTRIBUTE_DIRECTORY) |
|
ds@1952
|
117 |
{ |
|
ds@1952
|
118 |
CFileList *pSubList = new CFileList(fd.cFileName); |
|
ds@1952
|
119 |
|
|
ds@1952
|
120 |
UTIL_PathFormat(path, |
|
ds@1952
|
121 |
sizeof(path) / sizeof(TCHAR), |
|
ds@1952
|
122 |
_T("%s\\%s"), |
|
ds@1952
|
123 |
current_folder, |
|
ds@1952
|
124 |
fd.cFileName); |
|
ds@1952
|
125 |
|
|
ds@1952
|
126 |
RecursiveBuildFileList(pSubList, path); |
|
ds@1952
|
127 |
|
|
ds@1952
|
128 |
file_list->AddFolder(pSubList); |
|
ds@1952
|
129 |
} |
|
ds@1952
|
130 |
else |
|
ds@1952
|
131 |
{ |
|
ds@1952
|
132 |
LARGE_INTEGER li; |
|
ds@1952
|
133 |
|
|
ds@1952
|
134 |
li.LowPart = fd.nFileSizeLow; |
|
ds@1952
|
135 |
li.HighPart = fd.nFileSizeHigh; |
|
ds@1952
|
136 |
|
|
ds@1952
|
137 |
file_list->AddFile(fd.cFileName, li.QuadPart); |
|
ds@1952
|
138 |
} |
|
ds@1952
|
139 |
} while (FindNextFile(hFind, &fd)); |
|
ds@1952
|
140 |
|
|
ds@1952
|
141 |
FindClose(hFind); |
|
ds@1952
|
142 |
} |
|
ds@1952
|
143 |
|
|
ds@1952
|
144 |
CFileList *CFileList::BuildFileList(const TCHAR *name, const TCHAR *root_folder) |
|
ds@1952
|
145 |
{ |
|
ds@1952
|
146 |
CFileList *pFileList = new CFileList(name); |
|
ds@1952
|
147 |
|
|
ds@1952
|
148 |
RecursiveBuildFileList(pFileList, root_folder); |
|
ds@1952
|
149 |
|
|
ds@1952
|
150 |
return pFileList; |
|
ds@1952
|
151 |
} |