Skip to content

Commit

Permalink
Fix: Fixed issue where coping or moving a folder would cause the cont…
Browse files Browse the repository at this point in the history
…ents of the destination folder to be empty (#15027)
  • Loading branch information
hishitetsu committed Mar 25, 2024
1 parent cab90bc commit 5a43a18
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 3 deletions.
11 changes: 11 additions & 0 deletions src/Files.App/Helpers/EnumConversionHelpers.cs
Expand Up @@ -18,6 +18,17 @@ public static CreationCollisionOption Convert(this NameCollisionOption option)
};
}

public static NameCollisionOption ConvertBack(this CreationCollisionOption option)
{
return option switch
{
CreationCollisionOption.FailIfExists => NameCollisionOption.FailIfExists,
CreationCollisionOption.GenerateUniqueName => NameCollisionOption.GenerateUniqueName,
CreationCollisionOption.ReplaceExisting => NameCollisionOption.ReplaceExisting,
_ => NameCollisionOption.GenerateUniqueName,
};
}

public static NameCollisionOption Convert(this FileNameConflictResolveOptionType option)
{
return option switch
Expand Down
12 changes: 9 additions & 3 deletions src/Files.App/Utils/Storage/Operations/FilesystemOperations.cs
Expand Up @@ -806,17 +806,23 @@ await _associatedInstance.FilesystemViewModel.GetFileFromPathAsync(iFilePath)

private async static Task<BaseStorageFolder> CloneDirectoryAsync(BaseStorageFolder sourceFolder, BaseStorageFolder destinationFolder, string sourceRootName, CreationCollisionOption collision = CreationCollisionOption.FailIfExists)
{
BaseStorageFolder createdRoot = await destinationFolder.CreateFolderAsync(sourceRootName, collision);
BaseStorageFolder createdRoot;
if (collision is CreationCollisionOption.ReplaceExisting)
// Dont't delete the contents of the folder
createdRoot = await destinationFolder.CreateFolderAsync(sourceRootName, CreationCollisionOption.OpenIfExists);
else
createdRoot = await destinationFolder.CreateFolderAsync(sourceRootName, collision);

destinationFolder = createdRoot;

foreach (BaseStorageFile fileInSourceDir in await sourceFolder.GetFilesAsync())
{
await fileInSourceDir.CopyAsync(destinationFolder, fileInSourceDir.Name, NameCollisionOption.GenerateUniqueName);
await fileInSourceDir.CopyAsync(destinationFolder, fileInSourceDir.Name, collision.ConvertBack());
}

foreach (BaseStorageFolder folderinSourceDir in await sourceFolder.GetFoldersAsync())
{
await CloneDirectoryAsync(folderinSourceDir, destinationFolder, folderinSourceDir.Name);
await CloneDirectoryAsync(folderinSourceDir, destinationFolder, folderinSourceDir.Name, collision);
}

return createdRoot;
Expand Down

0 comments on commit 5a43a18

Please sign in to comment.