Skip to main content

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)

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()
// 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")