public async Task <IStorageHistory> RenameAsync(IStorageItemWithPath source, string newName, NameCollisionOption collision, IProgress <FileSystemStatusCode> errorCode, CancellationToken cancellationToken) { var connection = await AppServiceConnectionHelper.Instance; if (connection == null || string.IsNullOrWhiteSpace(source.Path) || source.Path.StartsWith(@"\\?\", StringComparison.Ordinal) || FtpHelpers.IsFtpPath(source.Path)) { // Fallback to builtin file operations return(await filesystemOperations.RenameAsync(source, newName, collision, errorCode, cancellationToken)); } var renameResult = new ShellOperationResult(); var(status, response) = await connection.SendMessageForResponseAsync(new ValueSet() { { "Arguments", "FileOperation" }, { "fileop", "RenameItem" }, { "operationID", Guid.NewGuid().ToString() }, { "filepath", source.Path }, { "newName", newName }, { "overwrite", collision == NameCollisionOption.ReplaceExisting } }); var result = (FilesystemResult)(status == AppServiceResponseStatus.Success && response.Get("Success", false)); var shellOpResult = JsonConvert.DeserializeObject <ShellOperationResult>(response.Get("Result", "")); renameResult.Items.AddRange(shellOpResult?.Items ?? Enumerable.Empty <ShellOperationItemResult>()); result &= (FilesystemResult)renameResult.Items.All(x => x.Succeeded); if (result) { errorCode?.Report(FileSystemStatusCode.Success); var renamedSources = renameResult.Items.Where(x => x.Succeeded && x.Destination != null && x.Source != x.Destination) .Where(x => new[] { source }.Select(s => s.Path).Contains(x.Source)); if (renamedSources.Any()) { return(new StorageHistory(FileOperationType.Rename, source, StorageHelpers.FromPathAndType(renamedSources.Single().Destination, source.ItemType))); } return(null); // Cannot undo overwrite operation } else { // Retry failed operations return(await filesystemOperations.RenameAsync(source, newName, collision, errorCode, cancellationToken)); } }
public async Task <IStorageHistory> RenameAsync(IStorageItemWithPath source, string newName, NameCollisionOption collision, IProgress <FileSystemStatusCode> errorCode, CancellationToken cancellationToken) { var connection = await AppServiceConnectionHelper.Instance; if (connection == null || string.IsNullOrWhiteSpace(source.Path) || source.Path.StartsWith(@"\\?\")) { // Fallback to builtin file operations return(await filesystemOperations.RenameAsync(source, newName, collision, errorCode, cancellationToken)); } var(status, response) = await connection.SendMessageForResponseAsync(new ValueSet() { { "Arguments", "FileOperation" }, { "fileop", "RenameItem" }, { "operationID", Guid.NewGuid().ToString() }, { "filepath", source.Path }, { "newName", newName }, { "overwrite", collision == NameCollisionOption.ReplaceExisting } }); var result = (FilesystemResult)(status == AppServiceResponseStatus.Success && response.Get("Success", false)); if (result) { var renamedItems = JsonConvert.DeserializeObject <IEnumerable <string> >(response["RenamedItems"] as string); errorCode?.Report(FileSystemStatusCode.Success); if (collision != NameCollisionOption.ReplaceExisting && renamedItems != null && renamedItems.Count() == 1) { return(new StorageHistory(FileOperationType.Rename, source, StorageItemHelpers.FromPathAndType(renamedItems.Single(), source.ItemType))); } return(null); // Cannot undo overwrite operation } else { // Retry failed operations return(await filesystemOperations.RenameAsync(source, newName, collision, errorCode, cancellationToken)); } }