Skip to main content

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:

  1. State is saved to disk
  2. Progress is updated
  3. Editor remains interactive
  4. 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:

  1. Fix Redirectors - Cleans up redirectors from old location
  2. Delete Empty Folders - Removes source folders if empty
  3. Update References - All asset references are automatically updated by Unreal Engine

Crash Recovery

If the editor crashes during a move:

  1. Operation state is saved to JSON file
  2. On next editor launch, a prompt appears
  3. Choose to Resume or Cancel the operation
  4. If resumed, continues from last completed batch

Recovery file location:

ProjectDir/Saved/ElysAssetTools/MoveOperation.json

Usage

From Content Browser

  1. Select one or more folders in Content Browser
  2. Right-click and select Elys Asset Tools → Move Folder/Assets
  3. In the dialog:
    • Review selected folders
    • Choose destination folder
    • Click Move
  4. Monitor progress in the dialog
  5. 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

  1. Scan dependencies - Use Dependency Scanner to check external references
  2. Commit to version control - Save your work before large moves
  3. Close unnecessary editors - Reduce memory usage
  4. Test with small folders first - Verify behavior before large operations

During Move

  1. Don't close the editor - Let the operation complete
  2. Monitor progress - Watch the dialog for any errors
  3. Keep working - Editor remains usable during moves
  4. Be patient - Large moves (1000+ assets) can take several minutes

After Moving

  1. Verify results - Check that assets moved correctly
  2. Test functionality - Open some moved assets to verify references
  3. Delete state file - If successful, the state file is auto-deleted
  4. 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:

  1. A notification appears: "Incomplete move operation detected"
  2. Options: Resume or Cancel
  3. If Resume: Operation continues from last batch
  4. 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 SizeAssets to MoveEstimated Time
Small< 10010-30 seconds
Medium100-5001-5 minutes
Large500-20005-20 minutes
Very Large2000+20+ minutes
Performance Tip

Moving fewer, larger batches is faster than many small moves. Combine folders when possible.

Troubleshooting

Move Operation Stuck

If the move appears frozen:

  1. Check Output Log for errors
  2. Close and restart editor (will trigger crash recovery)
  3. Resume the operation

Assets Not Moving

If some assets don't move:

  1. Check if assets are locked by another process
  2. Verify you have write permissions
  3. Check Output Log for specific errors
  4. Try moving problem assets individually

References Broken After Move

If references break (rare):

  1. Use Tools → Fix Up Redirectors in Folder
  2. Right-click the new location → Fix Up Redirectors
  3. Restart editor to refresh Asset Registry

API Reference

See Move Operation API for complete API documentation.

Next Steps