Move Operations
The Move Operations system allows you to safely move folders and assets in bulk while preserving folder structure, updating references automatically, and providing crash recovery.
Overview
Key capabilities:
- Batch processing - Move multiple folders at once
- Folder hierarchy preservation - Maintains subfolder structure
- Automatic reference updates - All references are fixed automatically by UE
- Crash recovery - Resume if editor crashes mid-operation
- Progress tracking - Real-time progress indicators
How It Works
Move Process
graph TD
A[Select Folders] --> B[Choose Destination]
B --> C[Validate Move]
C --> D{Valid?}
D -->|No| E[Show Error]
D -->|Yes| F[Start Move]
F --> G[Process Batch]
G --> H[Save State]
H --> I{More Assets?}
I -->|Yes| G
I -->|No| J[Cleanup]
J --> K[Fix Redirectors]
K --> L[Delete Empty Folders]
L --> M[Complete]
Batch Processing
Assets are moved in small batches (default: 10 assets per batch):
- Keeps editor responsive
- Allows progress tracking
- Enables crash recovery
- Reduces memory pressure
After each batch:
- State is saved to disk
- Progress is updated
- Editor remains interactive
- Next batch is queued
Features
Multi-Folder Support
Select multiple folders and move them all at once:
- Each folder is processed independently
- Folder hierarchy is preserved
- Progress shown for all folders
Folder Hierarchy Preservation
When moving /Game/Source/SubFolder/:
- If moved to
/Game/Destination/ - Result:
/Game/Destination/SubFolder/ - All subfolder structure is maintained
Automatic Cleanup
After moving assets:
- Fix Redirectors - Cleans up redirectors from old location
- Delete Empty Folders - Removes source folders if empty
- Update References - All asset references are automatically updated by Unreal Engine
Crash Recovery
If the editor crashes during a move:
- Operation state is saved to JSON file
- On next editor launch, a prompt appears
- Choose to Resume or Cancel the operation
- If resumed, continues from last completed batch
Recovery file location:
ProjectDir/Saved/ElysAssetTools/MoveOperation.json
Usage
From Content Browser
- Select one or more folders in Content Browser
- Right-click and select Elys Asset Tools → Move Folder/Assets
- In the dialog:
- Review selected folders
- Choose destination folder
- Click Move
- Monitor progress in the dialog
- Operation completes automatically
Via Blueprint
// Get subsystem
UERP_AssetToolsEditorSubsystem* Subsystem =
GEditor->GetEditorSubsystem<UERP_AssetToolsEditorSubsystem>();
// Start move operation
TArray<FString> SourcePaths = {"/Game/Folder1", "/Game/Folder2"};
Subsystem->StartMoveAssets(SourcePaths, "/Game/Destination");
Via C++
// Create move operation
UERP_AssetMoveOperation* MoveOp = NewObject<UERP_AssetMoveOperation>();
// Configure
TArray<FString> Sources = {"/Game/Source1", "/Game/Source2"};
FString Destination = "/Game/NewLocation";
// Start
MoveOp->StartMoveOperation(Sources, Destination);
// Process (call in Tick or timer)
while (MoveOp->ProcessNextBatch(10))
{
// Still processing...
float Progress = MoveOp->GetProgress();
UE_LOG(LogElysAssetTools, Log, TEXT("Progress: %.1f%%"), Progress * 100.0f);
}
// Cleanup after completion
MoveOp->CleanupAfterMove(Sources);
Move Operation Data
State Persistence
USTRUCT()
struct FERP_AssetMoveOperationData
{
// Source folders being moved
UPROPERTY()
TArray<FString> SourceFolders;
// Destination path
UPROPERTY()
FString DestinationFolder;
// All assets to move
UPROPERTY()
TArray<FString> AllAssetsToMove;
// Assets already processed
UPROPERTY()
TArray<FString> ProcessedAssets;
// Current batch index
UPROPERTY()
int32 CurrentBatchIndex;
// Operation start time
UPROPERTY()
FDateTime StartTime;
};
Progress Tracking
// Get progress (0.0 to 1.0)
float Progress = MoveOp->GetProgress();
// Get counts
int32 Total = MoveOp->GetTotalAssets();
int32 Completed = MoveOp->GetCompletedAssets();
int32 Remaining = Total - Completed;
// Estimate time remaining
float TimeElapsed = MoveOp->GetElapsedTime();
float EstimatedTotal = (TimeElapsed / Progress);
float TimeRemaining = EstimatedTotal - TimeElapsed;
Best Practices
Before Moving
- Scan dependencies - Use Dependency Scanner to check external references
- Commit to version control - Save your work before large moves
- Close unnecessary editors - Reduce memory usage
- Test with small folders first - Verify behavior before large operations
During Move
- Don't close the editor - Let the operation complete
- Monitor progress - Watch the dialog for any errors
- Keep working - Editor remains usable during moves
- Be patient - Large moves (1000+ assets) can take several minutes
After Moving
- Verify results - Check that assets moved correctly
- Test functionality - Open some moved assets to verify references
- Delete state file - If successful, the state file is auto-deleted
- Commit changes - Save to version control
Crash Recovery
How It Works
Every batch, the operation state is saved:
{
"SourceFolders": ["/Game/Source1", "/Game/Source2"],
"DestinationFolder": "/Game/Destination",
"AllAssetsToMove": [...],
"ProcessedAssets": [...],
"CurrentBatchIndex": 42
}
On editor restart, if this file exists:
- A notification appears: "Incomplete move operation detected"
- Options: Resume or Cancel
- If Resume: Operation continues from last batch
- If Cancel: State file is deleted
Manual Recovery
If automatic recovery fails:
// Load saved state
FERP_AssetMoveOperationData SavedOp;
if (UERP_AssetMoveOperation::LoadOperationState(SavedOp))
{
// Create new operation
UERP_AssetMoveOperation* MoveOp = NewObject<UERP_AssetMoveOperation>();
// Resume from saved state
MoveOp->ResumeMoveOperation(SavedOp);
// Continue processing
while (MoveOp->ProcessNextBatch(10)) { }
// Cleanup
MoveOp->CleanupAfterMove(SavedOp.SourceFolders);
}
Performance
Batch Size
Default batch size: 10 assets per batch
Adjust based on your needs:
- Smaller batches (5) - More responsive, slower overall
- Larger batches (20) - Less responsive, faster overall
- Very large (50+) - May cause editor lag
Typical Performance
| Project Size | Assets to Move | Estimated Time |
|---|---|---|
| Small | < 100 | 10-30 seconds |
| Medium | 100-500 | 1-5 minutes |
| Large | 500-2000 | 5-20 minutes |
| Very Large | 2000+ | 20+ minutes |
Moving fewer, larger batches is faster than many small moves. Combine folders when possible.
Troubleshooting
Move Operation Stuck
If the move appears frozen:
- Check Output Log for errors
- Close and restart editor (will trigger crash recovery)
- Resume the operation
Assets Not Moving
If some assets don't move:
- Check if assets are locked by another process
- Verify you have write permissions
- Check Output Log for specific errors
- Try moving problem assets individually
References Broken After Move
If references break (rare):
- Use Tools → Fix Up Redirectors in Folder
- Right-click the new location → Fix Up Redirectors
- Restart editor to refresh Asset Registry
API Reference
See Move Operation API for complete API documentation.
Next Steps
- User Guide: Moving Assets - Step-by-step tutorial
- Crash Recovery - Detailed recovery guide
- Safe Deletion - Clean up after moving