public async Task RenameAsync()

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)) ?? "");
      }
    }