Plasma Engine  2.0
Loading...
Searching...
No Matches
OSFile.h
1#pragma once
2
3#include <Foundation/Basics.h>
4#include <Foundation/Communication/Event.h>
5#include <Foundation/IO/FileEnums.h>
6#include <Foundation/Strings/String.h>
7#include <Foundation/Strings/StringBuilder.h>
8#include <Foundation/Threading/AtomicInteger.h>
9#include <Foundation/Threading/Mutex.h>
10#include <Foundation/Time/Timestamp.h>
11
12struct plOSFileData;
13
14#if PL_ENABLED(PL_USE_POSIX_FILE_API)
15# include <Foundation/IO/Implementation/Posix/OSFileDeclarations_posix.h>
16#elif PL_ENABLED(PL_PLATFORM_WINDOWS)
17# include <Foundation/IO/Implementation/Win/OSFileDeclarations_win.h>
18#endif
19
22{
23 enum Enum
24 {
29 };
30};
31
33struct PL_FOUNDATION_DLL plFileStats
34{
37
39 void GetFullPath(plStringBuilder& ref_sPath) const;
40
44
48
51
53 plUInt64 m_uiFileSize = 0;
54
56 bool m_bIsDirectory = false;
57};
58
59#if PL_ENABLED(PL_SUPPORTS_FILE_ITERATORS) || defined(PL_DOCS)
60
61struct plFileIterationData;
62
64{
65 using StorageType = plUInt8;
66
67 enum Enum : plUInt8
68 {
69 Recursive = PL_BIT(0),
70 ReportFiles = PL_BIT(1),
71 ReportFolders = PL_BIT(2),
72
73 ReportFilesRecursive = Recursive | ReportFiles,
74 ReportFoldersRecursive = Recursive | ReportFolders,
75 ReportFilesAndFoldersRecursive = Recursive | ReportFiles | ReportFolders,
76
77 Default = ReportFilesAndFoldersRecursive,
78 };
79
80 struct Bits
81 {
82 StorageType Recursive : 1;
83 StorageType ReportFiles : 1;
84 StorageType ReportFolders : 1;
85 };
86};
87
88PL_DECLARE_FLAGS_OPERATORS(plFileSystemIteratorFlags);
89
93class PL_FOUNDATION_DLL plFileSystemIterator
94{
95 PL_DISALLOW_COPY_AND_ASSIGN(plFileSystemIterator);
96
97public:
100
112 void StartSearch(plStringView sSearchTerm, plBitflags<plFileSystemIteratorFlags> flags = plFileSystemIteratorFlags::Default); // [tested]
113
117 void StartMultiFolderSearch(plArrayPtr<plString> startFolders, plStringView sSearchTerm, plBitflags<plFileSystemIteratorFlags> flags = plFileSystemIteratorFlags::Default);
118
122 const plStringView GetCurrentSearchTerm() const { return m_sSearchTerm; }
123
127 const plStringBuilder& GetCurrentPath() const { return m_sCurPath; } // [tested]
128
130 const plFileStats& GetStats() const { return m_CurFile; } // [tested]
131
133 void Next(); // [tested]
134
136 void SkipFolder(); // [tested]
137
139 bool IsValid() const;
140
141private:
142 plInt32 InternalNext();
143
145 plStringBuilder m_sCurPath;
146
148
150 plFileStats m_CurFile;
151
153 plFileIterationData m_Data;
154
155 plString m_sSearchTerm;
156 plString m_sMultiSearchTerm;
157 plUInt32 m_uiCurrentStartFolder = 0;
158 plHybridArray<plString, 8> m_StartFolders;
159};
160
161#endif
162
169class PL_FOUNDATION_DLL plOSFile
170{
171 PL_DISALLOW_COPY_AND_ASSIGN(plOSFile);
172
173public:
174 plOSFile();
175 ~plOSFile();
176
178 plResult Open(plStringView sFile, plFileOpenMode::Enum openMode, plFileShareMode::Enum fileShareMode = plFileShareMode::Default); // [tested]
179
181 bool IsOpen() const; // [tested]
182
184 void Close(); // [tested]
185
187 plResult Write(const void* pBuffer, plUInt64 uiBytes); // [tested]
188
190 plUInt64 Read(void* pBuffer, plUInt64 uiBytes); // [tested]
191
193 plUInt64 ReadAll(plDynamicArray<plUInt8>& out_fileContent); // [tested]
194
196 plStringView GetOpenFileName() const { return m_sFileName; } // [tested]
197
199 plUInt64 GetFilePosition() const; // [tested]
200
202 void SetFilePosition(plInt64 iDistance, plFileSeekMode::Enum pos) const; // [tested]
203
205 plUInt64 GetFileSize() const; // [tested]
206
208 const plOSFileData& GetFileData() const { return m_FileData; }
209
218 static const plString GetCurrentWorkingDirectory(); // [tested]
219
223 static const plString MakePathAbsoluteWithCWD(plStringView sPath); // [tested]
224
226 static bool ExistsFile(plStringView sFile); // [tested]
227
229 static bool ExistsDirectory(plStringView sDirectory); // [tested]
230
235 static void FindFreeFilename(plStringBuilder& inout_sPath, plStringView sSuffix = "-");
236
238 static plResult DeleteFile(plStringView sFile); // [tested]
239
242 static plResult CreateDirectoryStructure(plStringView sDirectory); // [tested]
243
246 static plResult MoveFileOrDirectory(plStringView sFrom, plStringView sTo);
247
249 static plResult CopyFile(plStringView sSource, plStringView sDestination); // [tested]
250
251#if PL_ENABLED(PL_SUPPORTS_FILE_STATS) || defined(PL_DOCS)
253 static plResult GetFileStats(plStringView sFileOrFolder, plFileStats& out_stats); // [tested]
254
255# if (PL_ENABLED(PL_SUPPORTS_CASE_INSENSITIVE_PATHS) && PL_ENABLED(PL_SUPPORTS_UNRESTRICTED_FILE_ACCESS)) || defined(PL_DOCS)
257 static plResult GetFileCasing(plStringView sFileOrFolder, plStringBuilder& out_sCorrectSpelling); // [tested]
258# endif
259
260#endif
261
262#if (PL_ENABLED(PL_SUPPORTS_FILE_ITERATORS) && PL_ENABLED(PL_SUPPORTS_FILE_STATS)) || defined(PL_DOCS)
263
265 static void GatherAllItemsInFolder(plDynamicArray<plFileStats>& out_itemList, plStringView sFolder, plBitflags<plFileSystemIteratorFlags> flags = plFileSystemIteratorFlags::Default);
266
270 static plResult CopyFolder(plStringView sSourceFolder, plStringView sDestinationFolder, plDynamicArray<plString>* out_pFilesCopied = nullptr);
271
274
275#endif
276
279
281 static plStringView GetApplicationDirectory();
282
290 static plString GetUserDataFolder(plStringView sSubFolder = {});
291
298 static plString GetTempDataFolder(plStringView sSubFolder = {});
299
308
309
310public:
330
333 {
335 EventType::Enum m_EventType = EventType::None;
336
339 plInt32 m_iFileID = 0;
340
343
346
349
351 bool m_bSuccess = true;
352
355
357 plUInt64 m_uiBytesAccessed = 0;
358 };
359
361
363 static void AddEventHandler(Event::Handler handler) { s_FileEvents.AddEventHandler(handler); }
364
366 static void RemoveEventHandler(Event::Handler handler) { s_FileEvents.RemoveEventHandler(handler); }
367
368private:
370 static Event s_FileEvents;
371
372 // *** Internal Functions that do the platform specific work ***
373
374 plResult InternalOpen(plStringView sFile, plFileOpenMode::Enum OpenMode, plFileShareMode::Enum FileShareMode);
375 void InternalClose();
376 plResult InternalWrite(const void* pBuffer, plUInt64 uiBytes);
377 plUInt64 InternalRead(void* pBuffer, plUInt64 uiBytes);
378 plUInt64 InternalGetFilePosition() const;
379 void InternalSetFilePosition(plInt64 iDistance, plFileSeekMode::Enum Pos) const;
380
381 static bool InternalExistsFile(plStringView sFile);
382 static bool InternalExistsDirectory(plStringView sDirectory);
383 static plResult InternalDeleteFile(plStringView sFile);
384 static plResult InternalDeleteDirectory(plStringView sDirectory);
385 static plResult InternalCreateDirectory(plStringView sFile);
386 static plResult InternalMoveFileOrDirectory(plStringView sDirectoryFrom, plStringView sDirectoryTo);
387
388#if PL_ENABLED(PL_SUPPORTS_FILE_STATS)
389 static plResult InternalGetFileStats(plStringView sFileOrFolder, plFileStats& out_Stats);
390#endif
391
392 // *************************************************************
393
395 plFileOpenMode::Enum m_FileMode;
396
398 bool m_bRetryOnSharingViolation = true;
399
401 plStringBuilder m_sFileName;
402
404 plInt32 m_iFileID;
405
407 plOSFileData m_FileData;
408
410 static plString64 s_sApplicationPath;
411
413 static plString64 s_sUserDataPath;
414
416 static plString64 s_sTempDataPath;
417
419 static plString64 s_sUserDocumentsPath;
420
422 static plAtomicInteger32 s_iFileCounter;
423};
This class encapsulates an array and it's size. It is recommended to use this class instead of plain ...
Definition ArrayPtr.h:37
Definition DynamicArray.h:81
Definition Event.h:177
An plFileSystemIterator allows to iterate over all files in a certain directory.
Definition OSFile.h:94
bool IsValid() const
Returns true if the iterator currently points to a valid file entry.
void StartMultiFolderSearch(plArrayPtr< plString > startFolders, plStringView sSearchTerm, plBitflags< plFileSystemIteratorFlags > flags=plFileSystemIteratorFlags::Default)
The same as StartSearch() but executes the same search on multiple folders.
void StartSearch(plStringView sSearchTerm, plBitflags< plFileSystemIteratorFlags > flags=plFileSystemIteratorFlags::Default)
Starts a search at the given folder. Use * and ? as wildcards.
void Next()
Advances the iterator to the next file object. Might recurse into sub-folders.
const plFileStats & GetStats() const
Returns the file stats of the current object that the iterator points to.
Definition OSFile.h:130
const plStringView GetCurrentSearchTerm() const
Returns the search string with which StartSearch() was called.
Definition OSFile.h:122
void SkipFolder()
The same as 'Next' only that the current folder will not be recursed into.
const plStringBuilder & GetCurrentPath() const
Returns the current path in which files are searched. Changes when 'Next' moves in or out of a sub-fo...
Definition OSFile.h:127
A hybrid array uses in-place storage to handle the first few elements without any allocation....
Definition HybridArray.h:12
This is an abstraction for the most important file operations.
Definition OSFile.h:170
static void GatherAllItemsInFolder(plDynamicArray< plFileStats > &out_itemList, plStringView sFolder, plBitflags< plFileSystemIteratorFlags > flags=plFileSystemIteratorFlags::Default)
Returns the plFileStats for all files and folders in the given folder.
static plStringView GetApplicationPath()
Returns the full path to the application binary.
static plResult GetFileCasing(plStringView sFileOrFolder, plStringBuilder &out_sCorrectSpelling)
Useful on systems that are not strict about the casing of file names. Determines the correct name of ...
static plResult GetFileStats(plStringView sFileOrFolder, plFileStats &out_stats)
Gets the stats about the given file or folder. Returns false, if the stats could not be determined.
static plString GetUserDocumentsFolder(plStringView sSubFolder={})
Returns the folder into which the user may want to store documents. Append a sub-folder for your appl...
static plString GetTempDataFolder(plStringView sSubFolder={})
Returns the folder into which temp data may be written.
const plOSFileData & GetFileData() const
This will return the platform specific file data (handles etc.), if you really want to be able to wre...
Definition OSFile.h:208
static const plString GetCurrentWorkingDirectory()
Returns the processes current working directory (CWD).
static plResult DeleteFolder(plStringView sFolder)
Deletes all files recursively in szFolder.
static void RemoveEventHandler(Event::Handler handler)
Unregisters a previously registered receiver. It is an error to unregister a receiver that was not re...
Definition OSFile.h:366
static plResult CopyFolder(plStringView sSourceFolder, plStringView sDestinationFolder, plDynamicArray< plString > *out_pFilesCopied=nullptr)
Copies szSourceFolder to szDestinationFolder. Overwrites existing files.
static plString GetUserDataFolder(plStringView sSubFolder={})
Returns the folder into which user data may be safely written. Append a sub-folder for your applicati...
static void AddEventHandler(Event::Handler handler)
Allows to register a function as an event receiver. All receivers will be notified in the order that ...
Definition OSFile.h:363
plStringView GetOpenFileName() const
Returns the name of the file that is currently opened. Returns an empty string, if no file is open.
Definition OSFile.h:196
plStringBuilder is a class that is meant for creating and modifying strings.
Definition StringBuilder.h:35
plStringView represent a read-only sub-string of a larger string, as it can store a dedicated string ...
Definition StringView.h:34
The timestamp class encapsulates a date in time as microseconds since Unix epoch.
Definition Timestamp.h:23
The plBitflags class allows you to work with type-safe bitflags.
Definition Bitflags.h:82
Defines in which mode to open a file.
Definition OSFile.h:22
Enum
Definition OSFile.h:24
@ Append
Open file for appending (writing, but always only at the end, already existing data is preserved).
Definition OSFile.h:28
@ Write
Open file for writing (already existing data is discarded).
Definition OSFile.h:27
@ None
None, only used internally.
Definition OSFile.h:25
@ Read
Open file for reading.
Definition OSFile.h:26
Enum
Definition FileEnums.h:18
Enum
Definition FileEnums.h:7
@ Default
Results in 'Exclusive' when requesting write access and 'SharedReads' when requesting read access....
Definition FileEnums.h:8
Holds the stats for a file.
Definition OSFile.h:34
plString m_sName
The name of the file or folder that the stats are for. Does not include the parent path to it....
Definition OSFile.h:47
plStringBuilder m_sParentPath
Path to the parent folder. Append m_sName to m_sParentPath to obtain the full path.
Definition OSFile.h:43
plTimestamp m_LastModificationTime
The last modification time as an UTC timestamp since Unix epoch.
Definition OSFile.h:50
Definition OSFile.h:81
Definition OSFile.h:64
The data that is sent through the event interface.
Definition OSFile.h:333
plTime m_Duration
How long the operation took.
Definition OSFile.h:354
plStringView m_sFile
The name of the file that was operated upon.
Definition OSFile.h:342
plStringView m_sFile2
If a second file was operated upon (FileCopy), that is the second file name.
Definition OSFile.h:345
Describes the types of events that plOSFile sends.
Definition OSFile.h:313
Enum
Definition OSFile.h:315
@ MakeDir
A path has been created (recursive directory creation).
Definition OSFile.h:324
@ FileCopy
A file has been copied to another location.
Definition OSFile.h:325
@ FileExists
A check whether a file exists has been done.
Definition OSFile.h:319
@ FileRead
From an open file data was read.
Definition OSFile.h:322
@ FileCasing
The exact spelling of a file/path is requested.
Definition OSFile.h:327
@ FileDelete
A file was attempted to be deleted.
Definition OSFile.h:321
@ FileClose
An open file has been closed.
Definition OSFile.h:318
@ FileStat
The stats of a file are queried.
Definition OSFile.h:326
@ FileOpen
A file has been (attempted) to open.
Definition OSFile.h:317
@ DirectoryExists
A check whether a directory exists has been done.
Definition OSFile.h:320
@ FileWrite
Data was written to an open file.
Definition OSFile.h:323
Default enum for returning failure or success, instead of using a bool.
Definition Types.h:54
The time class encapsulates a double value storing the time in seconds.
Definition Time.h:12