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
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
|
// FSFolder.h
#ifndef __FS_FOLDER_H
#define __FS_FOLDER_H
#include "../../../Common/MyCom.h"
#include "../../../Common/MyBuffer.h"
#include "../../../Windows/FileFind.h"
#include "../../Archive/IArchive.h"
#include "IFolder.h"
#include "TextPairs.h"
namespace NFsFolder {
class CFSFolder;
#define FS_SHOW_LINKS_INFO
struct CDirItem: public NWindows::NFile::NFind::CFileInfo
{
#ifndef UNDER_CE
UInt64 PackSize;
#endif
#ifdef FS_SHOW_LINKS_INFO
UInt64 FileIndex;
UInt32 NumLinks;
bool FileInfo_Defined;
bool FileInfo_WasRequested;
#endif
#ifndef UNDER_CE
bool PackSize_Defined;
#endif
bool FolderStat_Defined;
#ifndef UNDER_CE
CByteBuffer Reparse;
#endif
UInt64 NumFolders;
UInt64 NumFiles;
int Parent;
};
/*
struct CAltStream
{
UInt64 Size;
UInt64 PackSize;
bool PackSize_Defined;
int Parent;
UString Name;
};
*/
struct CFsFolderStat
{
UInt64 NumFolders;
UInt64 NumFiles;
UInt64 Size;
IProgress *Progress;
FString Path;
CFsFolderStat(): NumFolders(0), NumFiles(0), Size(0), Progress(NULL) {}
CFsFolderStat(const FString &path, IProgress *progress = NULL):
NumFolders(0), NumFiles(0), Size(0), Progress(progress), Path(path) {}
HRESULT Enumerate();
};
class CFSFolder:
public IFolderFolder,
public IArchiveGetRawProps,
public IFolderCompare,
#ifdef USE_UNICODE_FSTRING
public IFolderGetItemName,
#endif
public IFolderWasChanged,
public IFolderOperations,
// public IFolderOperationsDeleteToRecycleBin,
public IFolderCalcItemFullSize,
public IFolderClone,
public IFolderGetSystemIconIndex,
public IFolderSetFlatMode,
// public IFolderSetShowNtfsStreamsMode,
public CMyUnknownImp
{
public:
MY_QUERYINTERFACE_BEGIN2(IFolderFolder)
MY_QUERYINTERFACE_ENTRY(IArchiveGetRawProps)
MY_QUERYINTERFACE_ENTRY(IFolderCompare)
#ifdef USE_UNICODE_FSTRING
MY_QUERYINTERFACE_ENTRY(IFolderGetItemName)
#endif
MY_QUERYINTERFACE_ENTRY(IFolderWasChanged)
// MY_QUERYINTERFACE_ENTRY(IFolderOperationsDeleteToRecycleBin)
MY_QUERYINTERFACE_ENTRY(IFolderOperations)
MY_QUERYINTERFACE_ENTRY(IFolderCalcItemFullSize)
MY_QUERYINTERFACE_ENTRY(IFolderClone)
MY_QUERYINTERFACE_ENTRY(IFolderGetSystemIconIndex)
MY_QUERYINTERFACE_ENTRY(IFolderSetFlatMode)
// MY_QUERYINTERFACE_ENTRY(IFolderSetShowNtfsStreamsMode)
MY_QUERYINTERFACE_END
MY_ADDREF_RELEASE
INTERFACE_FolderFolder(;)
INTERFACE_IArchiveGetRawProps(;)
INTERFACE_FolderOperations(;)
STDMETHOD_(Int32, CompareItems)(UInt32 index1, UInt32 index2, PROPID propID, Int32 propIsRaw);
#ifdef USE_UNICODE_FSTRING
INTERFACE_IFolderGetItemName(;)
#endif
STDMETHOD(WasChanged)(Int32 *wasChanged);
STDMETHOD(Clone)(IFolderFolder **resultFolder);
STDMETHOD(CalcItemFullSize)(UInt32 index, IProgress *progress);
STDMETHOD(SetFlatMode)(Int32 flatMode);
// STDMETHOD(SetShowNtfsStreamsMode)(Int32 showStreamsMode);
STDMETHOD(GetSystemIconIndex)(UInt32 index, Int32 *iconIndex);
private:
FString _path;
CObjectVector<CDirItem> Files;
FStringVector Folders;
// CObjectVector<CAltStream> Streams;
// CMyComPtr<IFolderFolder> _parentFolder;
bool _commentsAreLoaded;
CPairsStorage _comments;
// bool _scanAltStreams;
bool _flatMode;
NWindows::NFile::NFind::CFindChangeNotification _findChangeNotification;
HRESULT GetItemsFullSize(const UInt32 *indices, UInt32 numItems, CFsFolderStat &stat);
HRESULT GetItemFullSize(unsigned index, UInt64 &size, IProgress *progress);
void GetAbsPath(const wchar_t *name, FString &absPath);
HRESULT BindToFolderSpec(CFSTR name, IFolderFolder **resultFolder);
bool LoadComments();
bool SaveComments();
HRESULT LoadSubItems(int dirItem, const FString &path);
#ifdef FS_SHOW_LINKS_INFO
bool ReadFileInfo(CDirItem &di);
#endif
public:
HRESULT Init(const FString &path /* , IFolderFolder *parentFolder */);
#if !defined(_WIN32) || defined(UNDER_CE)
HRESULT InitToRoot() { return Init(FSTRING_PATH_SEPARATOR /* , NULL */); }
#endif
CFSFolder() : _flatMode(false)
// , _scanAltStreams(false)
{}
void GetFullPath(const CDirItem &item, FString &path) const
{
// FString prefix;
// GetPrefix(item, prefix);
path = _path;
if (item.Parent >= 0)
path += Folders[item.Parent];
path += item.Name;
}
// void GetPrefix(const CDirItem &item, FString &prefix) const;
FString GetRelPath(const CDirItem &item) const;
void Clear()
{
Files.Clear();
Folders.Clear();
// Streams.Clear();
}
};
struct CCopyStateIO
{
IProgress *Progress;
UInt64 TotalSize;
UInt64 StartPos;
UInt64 CurrentSize;
bool DeleteSrcFile;
int ErrorFileIndex;
UString ErrorMessage;
CCopyStateIO(): DeleteSrcFile(false), TotalSize(0), StartPos(0) {}
HRESULT MyCopyFile(CFSTR inPath, CFSTR outPath);
};
HRESULT SendLastErrorMessage(IFolderOperationsExtractCallback *callback, const FString &fileName);
}
#endif
|