/// <summary> /// Moves a file. /// </summary> /// <param name="newPath">The new full path of the file.</param> /// <param name="collisionOption">How to deal with collisions with existing files.</param> /// <param name="cancellationToken">The cancellation token.</param> /// <returns> /// A task which will complete after the file is moved. /// </returns> public async Task MoveAsync(string newPath, NameCollisionOption collisionOption, CancellationToken cancellationToken) { Requires.NotNullOrEmpty(newPath, "newPath"); await AwaitExtensions.SwitchOffMainThreadAsync(cancellationToken); string newDirectory = System.IO.Path.GetDirectoryName(newPath); string newName = System.IO.Path.GetFileName(newPath); for (int counter = 1; ; counter++) { cancellationToken.ThrowIfCancellationRequested(); string candidateName = newName; if (counter > 1) { candidateName = String.Format( CultureInfo.InvariantCulture, "{0} ({1}){2}", System.IO.Path.GetFileNameWithoutExtension(newName), counter, System.IO.Path.GetExtension(newName)); } string candidatePath = PortablePath.Combine(newDirectory, candidateName); if (File.Exists(candidatePath)) { switch (collisionOption) { case NameCollisionOption.FailIfExists: throw new IOException("File already exists."); case NameCollisionOption.GenerateUniqueName: continue; // try again with a new name. case NameCollisionOption.ReplaceExisting: File.Delete(candidatePath); break; } } File.Move(_path, candidatePath); _path = candidatePath; _name = candidateName; return; } }
/// <summary> /// Checks whether a folder or file exists at the given location. /// </summary> /// <param name="name">The name of the file or folder to check for.</param> /// <param name="cancellationToken">The cancellation token.</param> /// <returns> /// A task whose result is the result of the existence check. /// </returns> public async Task <ExistenceCheckResult> CheckExistsAsync(string name, CancellationToken cancellationToken) { Requires.NotNullOrEmpty(name, "name"); await AwaitExtensions.SwitchOffMainThreadAsync(cancellationToken); string checkPath = PortablePath.Combine(this.Path, name); if (File.Exists(checkPath)) { return(ExistenceCheckResult.FileExists); } else if (Directory.Exists(checkPath)) { return(ExistenceCheckResult.FolderExists); } else { return(ExistenceCheckResult.NotFound); } }
/// <summary> /// Renames a file without changing its location. /// </summary> /// <param name="newName">The new leaf name of the file.</param> /// <param name="collisionOption">How to deal with collisions with existing files.</param> /// <param name="cancellationToken">The cancellation token.</param> /// <returns> /// A task which will complete after the file is renamed. /// </returns> public async Task RenameAsync(string newName, NameCollisionOption collisionOption, CancellationToken cancellationToken) { Requires.NotNullOrEmpty(newName, "newName"); await MoveAsync(PortablePath.Combine(System.IO.Path.GetDirectoryName(_path), newName), collisionOption, cancellationToken); }