in Core/src/Impl/Storages/FileSystemStorage.cs [84:127]
public async Task RenameAsync(SymbolStoragePath srcFile, SymbolStoragePath dstFile, AccessMode mode)
{
await Task.Yield();
using (await myRwLock.AcquireWriteLockAsync())
{
var tempExt = '.' + Guid.NewGuid().ToString("N") + ".tmp";
var dstDir = Path.GetDirectoryName(SymbolPathToRelativeDiskPath(dstFile));
var fullDir = myRootDir;
foreach (var part in string.IsNullOrEmpty(dstDir) ? [] : dstDir.Split(Path.DirectorySeparatorChar))
{
var newFullDir = Path.Combine(fullDir, part);
// Note: Should works on casing-insensitive file system!!!
var realDir = Directory.GetDirectories(fullDir, part).FirstOrDefault();
if (realDir == null)
Directory.CreateDirectory(newFullDir);
else if (realDir != newFullDir)
{
var tempDir = newFullDir + tempExt;
Directory.Move(realDir, tempDir);
Directory.Move(tempDir, newFullDir);
}
fullDir = newFullDir;
}
var newFileName = Path.GetFileName(SymbolPathToRelativeDiskPath(dstFile));
var fullNewFile = Path.Combine(fullDir, newFileName);
// Note: Should works on casing-insensitive file system!!!
var realFullFile = Directory.GetFiles(fullDir, newFileName).FirstOrDefault();
if (realFullFile == null)
File.Move(SymbolPathToDiskPath(srcFile), fullNewFile);
else if (realFullFile != fullNewFile)
{
var tempFile = fullNewFile + tempExt;
File.Move(SymbolPathToDiskPath(srcFile), tempFile);
File.Move(tempFile, fullNewFile);
}
TryRemoveEmptyDirsToRootDir(Path.GetDirectoryName(SymbolPathToRelativeDiskPath(srcFile)) ?? "");
}
}