xref: /aosp_15_r20/external/lzma/CPP/Windows/FileDir.h (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
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