Plasma Engine  2.0
Loading...
Searching...
No Matches
FileSystem.h
1#pragma once
2
3#include <Foundation/Communication/Event.h>
4#include <Foundation/Containers/HybridArray.h>
5#include <Foundation/Containers/Map.h>
6#include <Foundation/IO/FileSystem/Implementation/DataDirType.h>
7#include <Foundation/IO/OSFile.h>
8#include <Foundation/Threading/Mutex.h>
9
42class PL_FOUNDATION_DLL plFileSystem
43{
44public:
46 struct FileEventType;
47
49 struct FileEvent;
50
52 static plEventSubscriptionID RegisterEventHandler(plEvent<const FileEvent&>::Handler handler);
53
55 static void UnregisterEventHandler(plEvent<const FileEvent&>::Handler handler);
56 static void UnregisterEventHandler(plEventSubscriptionID subscriptionId);
57
58public:
64
75
77 static void RegisterDataDirectoryFactory(plDataDirFactory factory, float fPriority = 0); // [tested]
78
80 static void ClearAllDataDirectoryFactories() { s_pData->m_DataDirFactories.Clear(); } // [tested]
81
94 static plResult AddDataDirectory(plStringView sDataDirectory, plStringView sGroup = {}, plStringView sRootName = {}, plDataDirUsage usage = plDataDirUsage::ReadOnly); // [tested]
95
99 static bool RemoveDataDirectory(plStringView sRootName);
100
102 static plUInt32 RemoveDataDirectoryGroup(plStringView sGroup); // [tested]
103
105 static void ClearAllDataDirectories(); // [tested]
106
108 static const plDataDirectoryInfo* FindDataDirectoryWithRoot(plStringView sRootName);
109
111 static plUInt32 GetNumDataDirectories(); // [tested]
112
114 static plDataDirectoryType* GetDataDirectory(plUInt32 uiDataDirIndex); // [tested]
115
117 static const plDataDirectoryInfo& GetDataDirectoryInfo(plUInt32 uiDataDirIndex);
118
120 static void ReloadAllExternalDataDirectoryConfigs();
121
125
142 static plResult DetectSdkRootDirectory(plStringView sExpectedSubFolder = "Data/Base");
143
148 static void SetSdkRootDirectory(plStringView sSdkDir);
149
156 static plStringView GetSdkRootDirectory();
157
164 static void SetSpecialDirectory(plStringView sName, plStringView sReplacement);
165
179 static plResult ResolveSpecialDirectory(plStringView sDirectory, plStringBuilder& out_sPath);
180
182
185
188 static plMutex& GetMutex();
189
190#if PL_ENABLED(PL_SUPPORTS_FILE_ITERATORS)
192 static void StartSearch(plFileSystemIterator& ref_iterator, plStringView sSearchTerm, plBitflags<plFileSystemIteratorFlags> flags = plFileSystemIteratorFlags::Default);
193#endif
194
196
197 static plResult CreateDirectoryStructure(plStringView sPath);
198
199public:
204 static void DeleteFile(plStringView sFile); // [tested]
205
209 static bool ExistsFile(plStringView sFile); // [tested]
210
214 static plResult GetFileStats(plStringView sFileOrFolder, plFileStats& out_stats);
215
232 static plResult ResolvePath(plStringView sPath, plStringBuilder* out_pAbsolutePath, plStringBuilder* out_pDataDirRelativePath, const plDataDirectoryInfo** out_pDataDir = nullptr); // [tested]
233
242 static plResult FindFolderWithSubPath(plStringBuilder& ref_sResult, plStringView sStartDirectory, plStringView sSubPath, plStringView sRedirectionFileName = {}); // [tested]
243
245 static bool ResolveAssetRedirection(plStringView sPathOrAssetGuid, plStringBuilder& out_sRedirection);
246
253 static plStringView MigrateFileLocation(plStringView sOldLocation, plStringView sNewLocation);
254
255private:
257 friend class plFileReaderBase;
258 friend class plFileWriterBase;
259
267 static plDataDirectoryReader* GetFileReader(plStringView sFile, plFileShareMode::Enum FileShareMode, bool bAllowFileEvents);
268
276 static plDataDirectoryWriter* GetFileWriter(plStringView sFile, plFileShareMode::Enum FileShareMode, bool bAllowFileEvents);
277
278
279private:
280 PL_MAKE_SUBSYSTEM_STARTUP_FRIEND(Foundation, FileSystem);
281
283 static void Startup();
284
286 static void Shutdown();
287
288private:
289 struct Factory
290 {
291 PL_DECLARE_POD_TYPE();
292
293 float m_fPriority;
294 plDataDirFactory m_Factory;
295 };
296
297 struct FileSystemData
298 {
299 plHybridArray<Factory, 4> m_DataDirFactories;
301
303 plMutex m_FsMutex;
304 };
305
307 static plStringView ExtractRootName(plStringView sFile, plString& rootName);
308
310 static plStringView GetDataDirRelativePath(plStringView sFile, plUInt32 uiDataDir);
311
312 static plDataDirectoryInfo* GetDataDirForRoot(const plString& sRoot);
313
314 static void CleanUpRootName(plStringBuilder& sRoot);
315
316 static plString s_sSdkRootDir;
317 static plMap<plString, plString> s_SpecialDirectories;
318 static FileSystemData* s_pData;
319};
320
341
A base class for readers that handle reading from a (virtual) file inside a data directory.
Definition DataDirType.h:173
This is the base class for all data directory readers/writers.
Definition DataDirType.h:127
The base class for all data directory types.
Definition DataDirType.h:37
A base class for writers that handle writing to a (virtual) file inside a data directory.
Definition DataDirType.h:212
Definition Event.h:177
Definition FileReaderWriterBase.h:13
The plFileSystem provides high-level functionality to manage files in a virtual file system.
Definition FileSystem.h:43
static void ClearAllDataDirectoryFactories()
Will remove all known data directory factories.
Definition FileSystem.h:80
plDataDirectoryType *(*)(plStringView, plStringView, plStringView, plDataDirUsage) plDataDirFactory
This factory creates a data directory type, if it can handle the given data directory....
Definition FileSystem.h:74
An plFileSystemIterator allows to iterate over all files in a certain directory.
Definition OSFile.h:94
Definition FileReaderWriterBase.h:55
A hybrid array uses in-place storage to handle the first few elements without any allocation....
Definition HybridArray.h:12
Definition Map.h:408
Provides a simple mechanism for mutual exclusion to prevent multiple threads from accessing a shared ...
Definition Mutex.h:13
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 plBitflags class allows you to work with type-safe bitflags.
Definition Bitflags.h:82
Definition DataDirType.h:21
Enum
Definition FileEnums.h:7
Holds the stats for a file.
Definition OSFile.h:34
The event data that is broadcast by the plFileSystem upon certain file operations.
Definition FileSystem.h:344
const plDataDirectoryType * m_pDataDir
The data-directory, that was involved.
Definition FileSystem.h:355
plStringView m_sOther
Additional Path / Name that might be of interest.
Definition FileSystem.h:352
plFileSystem::FileEventType::Enum m_EventType
The exact event that occurred.
Definition FileSystem.h:346
plStringView m_sFileOrDirectory
Path to the file or directory that was involved.
Definition FileSystem.h:349
Describes the type of events that are broadcast by the plFileSystem.
Definition FileSystem.h:323
Enum
Definition FileSystem.h:325
@ CreateFileFailed
Opening a file for writing failed.
Definition FileSystem.h:332
@ OpenFileFailed
Opening a file for reading failed. Probably because it doesn't exist.
Definition FileSystem.h:329
@ CreateFileAttempt
A file is about to be opened for writing.
Definition FileSystem.h:330
@ AddDataDirectorySucceeded
A data directory was successfully added.
Definition FileSystem.h:334
@ AddDataDirectoryFailed
Adding a data directory failed. No factory could handle it (or there were none).
Definition FileSystem.h:335
@ OpenFileSucceeded
A file has been successfully opened for reading.
Definition FileSystem.h:328
@ CloseFile
A file was closed.
Definition FileSystem.h:333
@ RemoveDataDirectory
Definition FileSystem.h:336
@ None
None. Should not occur.
Definition FileSystem.h:326
@ CreateFileSucceeded
A file has been successfully opened for writing.
Definition FileSystem.h:331
@ OpenFileAttempt
A file is about to be opened for reading.
Definition FileSystem.h:327
@ DeleteFile
A file is about to be deleted.
Definition FileSystem.h:338
Default enum for returning failure or success, instead of using a bool.
Definition Types.h:54