1*f6dc9357SAndroid Build Coastguard Worker // Windows/FileDir.h
2*f6dc9357SAndroid Build Coastguard Worker
3*f6dc9357SAndroid Build Coastguard Worker #ifndef ZIP7_INC_WINDOWS_FILE_DIR_H
4*f6dc9357SAndroid Build Coastguard Worker #define ZIP7_INC_WINDOWS_FILE_DIR_H
5*f6dc9357SAndroid Build Coastguard Worker
6*f6dc9357SAndroid Build Coastguard Worker #include "../Common/MyString.h"
7*f6dc9357SAndroid Build Coastguard Worker
8*f6dc9357SAndroid Build Coastguard Worker #include "FileIO.h"
9*f6dc9357SAndroid Build Coastguard Worker
10*f6dc9357SAndroid Build Coastguard Worker namespace NWindows {
11*f6dc9357SAndroid Build Coastguard Worker namespace NFile {
12*f6dc9357SAndroid Build Coastguard Worker namespace NDir {
13*f6dc9357SAndroid Build Coastguard Worker
14*f6dc9357SAndroid Build Coastguard Worker bool GetWindowsDir(FString &path);
15*f6dc9357SAndroid Build Coastguard Worker bool GetSystemDir(FString &path);
16*f6dc9357SAndroid Build Coastguard Worker
17*f6dc9357SAndroid Build Coastguard Worker /*
18*f6dc9357SAndroid Build Coastguard Worker WIN32 API : SetFileTime() doesn't allow to set zero timestamps in file
19*f6dc9357SAndroid Build Coastguard Worker but linux : allows unix time = 0 in filesystem
20*f6dc9357SAndroid Build Coastguard Worker */
21*f6dc9357SAndroid Build Coastguard Worker
22*f6dc9357SAndroid Build Coastguard Worker bool SetDirTime(CFSTR path, const CFiTime *cTime, const CFiTime *aTime, const CFiTime *mTime);
23*f6dc9357SAndroid Build Coastguard Worker
24*f6dc9357SAndroid Build Coastguard Worker
25*f6dc9357SAndroid Build Coastguard Worker #ifdef _WIN32
26*f6dc9357SAndroid Build Coastguard Worker
27*f6dc9357SAndroid Build Coastguard Worker bool SetFileAttrib(CFSTR path, DWORD attrib);
28*f6dc9357SAndroid Build Coastguard Worker
29*f6dc9357SAndroid Build Coastguard Worker /*
30*f6dc9357SAndroid Build Coastguard Worker Some programs store posix attributes in high 16 bits of windows attributes field.
31*f6dc9357SAndroid Build Coastguard Worker Also some programs use additional flag markers: 0x8000 or 0x4000.
32*f6dc9357SAndroid Build Coastguard Worker SetFileAttrib_PosixHighDetect() tries to detect posix field, and it extracts only attribute
33*f6dc9357SAndroid Build Coastguard Worker bits that are related to current system only.
34*f6dc9357SAndroid Build Coastguard Worker */
35*f6dc9357SAndroid Build Coastguard Worker #else
36*f6dc9357SAndroid Build Coastguard Worker
37*f6dc9357SAndroid Build Coastguard Worker int my_chown(CFSTR path, uid_t owner, gid_t group);
38*f6dc9357SAndroid Build Coastguard Worker
39*f6dc9357SAndroid Build Coastguard Worker #endif
40*f6dc9357SAndroid Build Coastguard Worker
41*f6dc9357SAndroid Build Coastguard Worker bool SetFileAttrib_PosixHighDetect(CFSTR path, DWORD attrib);
42*f6dc9357SAndroid Build Coastguard Worker
43*f6dc9357SAndroid Build Coastguard Worker
44*f6dc9357SAndroid Build Coastguard Worker #ifndef _WIN32
45*f6dc9357SAndroid Build Coastguard Worker #define PROGRESS_CONTINUE 0
46*f6dc9357SAndroid Build Coastguard Worker #define PROGRESS_CANCEL 1
47*f6dc9357SAndroid Build Coastguard Worker // #define PROGRESS_STOP 2
48*f6dc9357SAndroid Build Coastguard Worker // #define PROGRESS_QUIET 3
49*f6dc9357SAndroid Build Coastguard Worker #endif
50*f6dc9357SAndroid Build Coastguard Worker Z7_PURE_INTERFACES_BEGIN
DECLARE_INTERFACE(ICopyFileProgress)51*f6dc9357SAndroid Build Coastguard Worker DECLARE_INTERFACE(ICopyFileProgress)
52*f6dc9357SAndroid Build Coastguard Worker {
53*f6dc9357SAndroid Build Coastguard Worker // in: total, current: include all/processed alt streams.
54*f6dc9357SAndroid Build Coastguard Worker // it returns PROGRESS_CONTINUE or PROGRESS_CANCEL.
55*f6dc9357SAndroid Build Coastguard Worker virtual DWORD CopyFileProgress(UInt64 total, UInt64 current) = 0;
56*f6dc9357SAndroid Build Coastguard Worker };
57*f6dc9357SAndroid Build Coastguard Worker Z7_PURE_INTERFACES_END
58*f6dc9357SAndroid Build Coastguard Worker
59*f6dc9357SAndroid Build Coastguard Worker bool MyMoveFile(CFSTR existFileName, CFSTR newFileName);
60*f6dc9357SAndroid Build Coastguard Worker // (progress == NULL) is allowed
61*f6dc9357SAndroid Build Coastguard Worker bool MyMoveFile_with_Progress(CFSTR oldFile, CFSTR newFile,
62*f6dc9357SAndroid Build Coastguard Worker ICopyFileProgress *progress);
63*f6dc9357SAndroid Build Coastguard Worker
64*f6dc9357SAndroid Build Coastguard Worker
65*f6dc9357SAndroid Build Coastguard Worker #ifndef UNDER_CE
66*f6dc9357SAndroid Build Coastguard Worker bool MyCreateHardLink(CFSTR newFileName, CFSTR existFileName);
67*f6dc9357SAndroid Build Coastguard Worker #endif
68*f6dc9357SAndroid Build Coastguard Worker
69*f6dc9357SAndroid Build Coastguard Worker bool RemoveDir(CFSTR path);
70*f6dc9357SAndroid Build Coastguard Worker bool CreateDir(CFSTR path);
71*f6dc9357SAndroid Build Coastguard Worker
72*f6dc9357SAndroid Build Coastguard Worker /* CreateComplexDir returns true, if directory can contain files after the call (two cases):
73*f6dc9357SAndroid Build Coastguard Worker 1) the directory already exists (network shares and drive paths are supported)
74*f6dc9357SAndroid Build Coastguard Worker 2) the directory was created
75*f6dc9357SAndroid Build Coastguard Worker path can be WITH or WITHOUT trailing path separator. */
76*f6dc9357SAndroid Build Coastguard Worker
77*f6dc9357SAndroid Build Coastguard Worker bool CreateComplexDir(CFSTR path);
78*f6dc9357SAndroid Build Coastguard Worker
79*f6dc9357SAndroid Build Coastguard Worker bool DeleteFileAlways(CFSTR name);
80*f6dc9357SAndroid Build Coastguard Worker bool RemoveDirWithSubItems(const FString &path);
81*f6dc9357SAndroid Build Coastguard Worker
82*f6dc9357SAndroid Build Coastguard Worker bool MyGetFullPathName(CFSTR path, FString &resFullPath);
83*f6dc9357SAndroid Build Coastguard Worker bool GetFullPathAndSplit(CFSTR path, FString &resDirPrefix, FString &resFileName);
84*f6dc9357SAndroid Build Coastguard Worker bool GetOnlyDirPrefix(CFSTR path, FString &resDirPrefix);
85*f6dc9357SAndroid Build Coastguard Worker
86*f6dc9357SAndroid Build Coastguard Worker #ifndef UNDER_CE
87*f6dc9357SAndroid Build Coastguard Worker
88*f6dc9357SAndroid Build Coastguard Worker bool SetCurrentDir(CFSTR path);
89*f6dc9357SAndroid Build Coastguard Worker bool GetCurrentDir(FString &resultPath);
90*f6dc9357SAndroid Build Coastguard Worker
91*f6dc9357SAndroid Build Coastguard Worker #endif
92*f6dc9357SAndroid Build Coastguard Worker
93*f6dc9357SAndroid Build Coastguard Worker bool MyGetTempPath(FString &resultPath);
94*f6dc9357SAndroid Build Coastguard Worker
95*f6dc9357SAndroid Build Coastguard Worker bool CreateTempFile2(CFSTR prefix, bool addRandom, AString &postfix, NIO::COutFile *outFile);
96*f6dc9357SAndroid Build Coastguard Worker
97*f6dc9357SAndroid Build Coastguard Worker class CTempFile MY_UNCOPYABLE
98*f6dc9357SAndroid Build Coastguard Worker {
99*f6dc9357SAndroid Build Coastguard Worker bool _mustBeDeleted;
100*f6dc9357SAndroid Build Coastguard Worker FString _path;
DisableDeleting()101*f6dc9357SAndroid Build Coastguard Worker void DisableDeleting() { _mustBeDeleted = false; }
102*f6dc9357SAndroid Build Coastguard Worker public:
CTempFile()103*f6dc9357SAndroid Build Coastguard Worker CTempFile(): _mustBeDeleted(false) {}
~CTempFile()104*f6dc9357SAndroid Build Coastguard Worker ~CTempFile() { Remove(); }
GetPath()105*f6dc9357SAndroid Build Coastguard Worker const FString &GetPath() const { return _path; }
106*f6dc9357SAndroid Build Coastguard Worker bool Create(CFSTR pathPrefix, NIO::COutFile *outFile); // pathPrefix is not folder prefix
107*f6dc9357SAndroid Build Coastguard Worker bool CreateRandomInTempFolder(CFSTR namePrefix, NIO::COutFile *outFile);
108*f6dc9357SAndroid Build Coastguard Worker bool Remove();
109*f6dc9357SAndroid Build Coastguard Worker // bool MoveTo(CFSTR name, bool deleteDestBefore);
110*f6dc9357SAndroid Build Coastguard Worker bool MoveTo(CFSTR name, bool deleteDestBefore,
111*f6dc9357SAndroid Build Coastguard Worker ICopyFileProgress *progress);
112*f6dc9357SAndroid Build Coastguard Worker };
113*f6dc9357SAndroid Build Coastguard Worker
114*f6dc9357SAndroid Build Coastguard Worker
115*f6dc9357SAndroid Build Coastguard Worker #ifdef _WIN32
116*f6dc9357SAndroid Build Coastguard Worker class CTempDir MY_UNCOPYABLE
117*f6dc9357SAndroid Build Coastguard Worker {
118*f6dc9357SAndroid Build Coastguard Worker bool _mustBeDeleted;
119*f6dc9357SAndroid Build Coastguard Worker FString _path;
120*f6dc9357SAndroid Build Coastguard Worker public:
CTempDir()121*f6dc9357SAndroid Build Coastguard Worker CTempDir(): _mustBeDeleted(false) {}
~CTempDir()122*f6dc9357SAndroid Build Coastguard Worker ~CTempDir() { Remove(); }
GetPath()123*f6dc9357SAndroid Build Coastguard Worker const FString &GetPath() const { return _path; }
DisableDeleting()124*f6dc9357SAndroid Build Coastguard Worker void DisableDeleting() { _mustBeDeleted = false; }
125*f6dc9357SAndroid Build Coastguard Worker bool Create(CFSTR namePrefix) ;
126*f6dc9357SAndroid Build Coastguard Worker bool Remove();
127*f6dc9357SAndroid Build Coastguard Worker };
128*f6dc9357SAndroid Build Coastguard Worker #endif
129*f6dc9357SAndroid Build Coastguard Worker
130*f6dc9357SAndroid Build Coastguard Worker
131*f6dc9357SAndroid Build Coastguard Worker #if !defined(UNDER_CE)
132*f6dc9357SAndroid Build Coastguard Worker class CCurrentDirRestorer MY_UNCOPYABLE
133*f6dc9357SAndroid Build Coastguard Worker {
134*f6dc9357SAndroid Build Coastguard Worker FString _path;
135*f6dc9357SAndroid Build Coastguard Worker public:
136*f6dc9357SAndroid Build Coastguard Worker bool NeedRestore;
137*f6dc9357SAndroid Build Coastguard Worker
CCurrentDirRestorer()138*f6dc9357SAndroid Build Coastguard Worker CCurrentDirRestorer(): NeedRestore(true)
139*f6dc9357SAndroid Build Coastguard Worker {
140*f6dc9357SAndroid Build Coastguard Worker GetCurrentDir(_path);
141*f6dc9357SAndroid Build Coastguard Worker }
~CCurrentDirRestorer()142*f6dc9357SAndroid Build Coastguard Worker ~CCurrentDirRestorer()
143*f6dc9357SAndroid Build Coastguard Worker {
144*f6dc9357SAndroid Build Coastguard Worker if (!NeedRestore)
145*f6dc9357SAndroid Build Coastguard Worker return;
146*f6dc9357SAndroid Build Coastguard Worker FString s;
147*f6dc9357SAndroid Build Coastguard Worker if (GetCurrentDir(s))
148*f6dc9357SAndroid Build Coastguard Worker if (s != _path)
149*f6dc9357SAndroid Build Coastguard Worker SetCurrentDir(_path);
150*f6dc9357SAndroid Build Coastguard Worker }
151*f6dc9357SAndroid Build Coastguard Worker };
152*f6dc9357SAndroid Build Coastguard Worker #endif
153*f6dc9357SAndroid Build Coastguard Worker
154*f6dc9357SAndroid Build Coastguard Worker }}}
155*f6dc9357SAndroid Build Coastguard Worker
156*f6dc9357SAndroid Build Coastguard Worker #endif
157