File Operations Guide
Complete guide to file and directory operations with EFM.
Creating Directories
Always create your directory structure at game startup:
// Create a single directory
SavedDir = GetGameSavedDirectory() + "MyGame/"
if not DirectoryExists(SavedDir):
CreateDirectory(SavedDir)
// Create nested directories at once
CreateDirectoryTree(GetGameSavedDirectory() + "MyGame/Saves/Slot1/")
Creating and Writing Files
Method 1: Using CreateFile + UEFMFile
CreateFile(GetGameSavedDirectory(), "config.txt") -> bSuccess, ConfigFile
if bSuccess:
ConfigFile.AppendString("Setting1=Value1\n")
ConfigFile.AppendString("Setting2=Value2\n")
Method 2: Using WriteBytes
CreateFile(GetGameSavedDirectory(), "data.bin") -> bSuccess, DataFile
if bSuccess:
DataFile.WriteBytes(YourByteArray)
Method 3: Using Async Write (non-blocking)
AsyncWriteString(
Self,
GetGameSavedDirectory() + "log.txt",
"Game started at " + CurrentTime,
OnComplete(bSuccess, FilePath):
if bSuccess:
Log("Written: " + FilePath)
)
Reading Files
Read as Strings
ReadFile(GetGameSavedDirectory(), "config.txt") -> bSuccess, ConfigFile
if bSuccess:
Lines = ConfigFile.GetStrings()
for Line in Lines:
ProcessLine(Line)
Read as Bytes
ReadFile(GetGameSavedDirectory(), "data.bin") -> bSuccess, DataFile
if bSuccess:
Bytes = DataFile.GetBytes()
DeserializeData(Bytes)
Read as Image
ReadFile(GetGameSavedDirectory(), "screenshot.png") -> bSuccess, ImageFile
if bSuccess:
ImageFile.GetTexture(ConversionResult, Texture)
if ConversionResult == EImageConversionResult.Success:
MyImage.SetBrushFromTexture(Texture)
Read as Sound
ReadFile(GetGameSavedDirectory(), "voice.wav") -> bSuccess, SoundFile
if bSuccess:
SoundWave = SoundFile.GetSound()
if SoundWave:
PlaySound2D(Self, SoundWave)
Copying, Moving, Renaming
Copy a File
ReadFile(SourceDir, "file.txt") -> bSuccess, FileObj
if bSuccess:
CopyFileObject(FileObj, DestDir + "file_copy.txt") -> bSuccess2, CopiedFile
Move a File
ReadFile(SourceDir, "file.txt") -> bSuccess, FileObj
if bSuccess:
MoveFileObject(FileObj, DestDir + "file.txt") -> bSuccess2
Rename a File
ReadFile(Dir, "old_name.txt") -> bSuccess, FileObj
if bSuccess:
RenameFileObject(FileObj, "new_name.txt") -> bSuccess2
Delete a File
ReadFile(Dir, "temp.txt") -> bSuccess, FileObj
if bSuccess:
DeleteFileObject(FileObj) -> bSuccess2
Directory Operations
Copy Directory
CopyDirectory(
GetGameSavedDirectory() + "Saves/",
GetGameSavedDirectory() + "Backup/Saves/",
true // overwrite
)
Move Directory
MoveDirectory(
GetGameSavedDirectory() + "OldFolder/",
GetGameSavedDirectory() + "NewFolder/"
)
Rename Directory
RenameDirectory(
GetGameSavedDirectory() + "OldName",
"NewName"
)
Delete Directory
DeleteDirectory(
GetGameSavedDirectory() + "Temp/",
true // recursively
)
Get Directory Content
// Get only files
Files = GetDirectoryContent(Dir, true, false)
// Get only directories
Dirs = GetDirectoryContent(Dir, false, true)
// Get both
All = GetDirectoryContent(Dir, true, true)
Advanced Search
Search by Pattern (Wildcard)
// Find all .json files
JsonFiles = SearchFiles(Dir, "*.json", true, false)
Search by Pattern (Regex)
// Find files matching regex pattern
LogFiles = SearchFiles(Dir, "log_\\d{4}-\\d{2}-\\d{2}\\.txt", true, true)
Search by Extension
// Find all image files
ImageFiles = SearchFilesByExtension(Dir, [".png", ".jpg", ".bmp"], true)
Search by Date
// Find files modified in the last week
MinDate = Today - 7 days
MaxDate = Today
RecentFiles = SearchFilesByDate(Dir, MinDate, MaxDate, true)
Search by Size
// Find files between 1MB and 100MB
LargeFiles = SearchFilesBySize(Dir, 1048576, 104857600, true)
File Metadata
ReadFile(Dir, "file.txt") -> bSuccess, FileObj
if bSuccess:
// Size
SizeBytes = FileObj.GetSizeInBytes()
SizeMB = FileObj.GetSizeInMegaBytes()
HumanSize = FileObj.GetHumanReadableSize() // "1.5 MB"
// Timestamps
Created = FileObj.GetCreationTime()
Modified = FileObj.GetLastModifiedTime()
Accessed = FileObj.GetLastAccessTime()
// Hashes
MD5 = FileObj.GetMD5()
SHA1 = FileObj.GetSHA1()
// Attributes
bReadOnly = FileObj.IsReadOnly()
FileObj.SetReadOnly(true)
Clipboard
// Copy text to clipboard
CopyToClipboard("Hello, World!")
// Read from clipboard
if HasClipboardText():
Text = GetFromClipboard()
ProcessText(Text)
// Clear clipboard
ClearClipboard()
Symbolic Links
// Create a symbolic link to a file
CreateSymbolicLink(
GetGameSavedDirectory() + "link.txt",
"C:/original/file.txt",
false // not a directory
)
// Check if a path is a symlink
if IsSymbolicLink(SomePath):
Target = GetSymbolicLinkTarget(SomePath)
Log("Points to: " + Target)
// Resolve symlink
ResolvedPath = ""
if ResolveSymbolicLink(SomePath, ResolvedPath):
Log("Resolved: " + ResolvedPath)
// Create hard link
CreateHardLink(
GetGameSavedDirectory() + "hardlink.txt",
"C:/original/file.txt"
)
Directory Statistics
// Get file count
Count = GetFileCount(Dir, true) // recursive
// Get directory count
DirCount = GetDirectoryCount(Dir, true)
// Get total size
TotalSize = GetDirectorySize(Dir, true)
// Get all stats at once
GetDirectoryStatistics(Dir, true, FileCount, DirCount, TotalSize)
// Get file count by extension
ExtMap = GetFileCountByExtension(Dir, true)
// ExtMap[".txt"] = 15
// ExtMap[".png"] = 8
// Get largest files
Largest = GetLargestFiles(Dir, 10, true) // top 10
File Hashing & Verification
// Get hash
MD5 = GetFileMD5(Dir, "file.txt")
SHA1 = GetFileSHA1(Dir, "file.txt")
// Verify against expected hash
if VerifyFileHash(Dir, "file.txt", ExpectedMD5, EFileHashType.MD5):
Log("File integrity verified")
else:
LogError("File has been modified or corrupted")