Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix: Fixed issue where coping or moving a folder would cause the contents of the destination folder to be empty #15027

Merged
merged 1 commit into from Mar 25, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
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