/// <inheritdoc/> public async Task Open(CancellationToken cancellationToken) { if (_open == false) { string path = _configuration.Value.File; string dir = _path.GetDirectoryName(path); if (string.IsNullOrEmpty(dir) == false) { await _directoryCreator .CreateDirectoryAsync(dir, cancellationToken) .ConfigureAwait(Await.Default); } var fileInfo = _fileInfoFactory.FromFileName(path); _stream = fileInfo.Open(FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None); await Load(cancellationToken) .ConfigureAwait(Await.Default); _open = true; } }
/// <summary> /// Handles writing a file from a stream /// </summary> /// <param name="command">The command</param> /// <param name="cancellationToken">The cancellation token</param> /// <returns></returns> public async Task <WriteFileFromStreamCommandResult> Handle( WriteFileFromStreamCommand command, CancellationToken cancellationToken) { Argument.NotNull(command, nameof(command)); var commandResult = new WriteFileFromStreamCommandResult(); string folderPath = command.Path; if (string.IsNullOrEmpty(folderPath) == false) { await _directoryCreator .CreateDirectoryAsync(folderPath, cancellationToken) .ConfigureAwait(Await.Default); } string filePath = _path.Combine(folderPath, command.FileName); byte[] buffer = new byte[BufferSize]; long bytesWritten = 0L; using (var fileStream = _fileStreamFactory.Create(filePath, FileMode.Create, FileAccess.Write, FileShare.None, BufferSize, useAsync: true)) { int read; while ((read = await command.File .ReadAsync(buffer, 0, buffer.Length, cancellationToken) .ConfigureAwait(Await.Default)) > 0) { bytesWritten += read; if (bytesWritten > command.Size.Value) { throw new InvalidOperationException("Bytes saved greater than file size."); } await fileStream .WriteAsync(buffer, 0, read, cancellationToken) .ConfigureAwait(Await.Default); } await fileStream .FlushAsync(cancellationToken) .ConfigureAwait(Await.Default); } Require.MustBeTrue(bytesWritten, command.Size == bytesWritten, nameof(command.Size), "File size equals bytes saved"); commandResult.Result = WriteFileFromStreamCommandResultKind.Success; commandResult.BytesWritten = bytesWritten; return(commandResult); }
/// <summary> /// Handles the moving of the file /// </summary> /// <param name="command">The command</param> /// <param name="cancellationToken">The cancellation token</param> /// <returns></returns> public async Task <MoveFileCommandResult> Handle( MoveFileCommand command, CancellationToken cancellationToken) { Argument.NotNull(command, nameof(command)); var commandResult = new MoveFileCommandResult(); string source = command.Source; string destination = command.Destination; string backup = command.Backup; var fileInfoSource = _fileInfoFactory.FromFileName(source); if (fileInfoSource.Exists) { var fileInfoDestination = _fileInfoFactory.FromFileName(destination); var directoryInfoDestination = fileInfoDestination.Directory; if (directoryInfoDestination.Exists) { if (fileInfoDestination.Exists) { if (command.Overwrite == true) { Require.NotNullOrEmpty(backup, nameof(backup)); commandResult.BackupFileSize = fileInfoDestination.Length; var fileInfoBackup = _fileInfoFactory.FromFileName(backup); await _directoryCreator .CreateDirectoryAsync(fileInfoBackup.DirectoryName, cancellationToken) .ConfigureAwait(Await.Default); _ = fileInfoSource.Replace(destination, backup); fileInfoSource.Delete(); commandResult.FileOverwritten = true; } else { throw new IOException("File already exists and overwrite is set to false."); } } else { fileInfoSource.MoveTo(destination); } } else { await _directoryCreator .CreateDirectoryAsync(directoryInfoDestination.FullName, cancellationToken) .ConfigureAwait(Await.Default); fileInfoSource.MoveTo(destination); } } else { throw new FileNotFoundException("Source file does not exist.", fileInfoSource.FullName); } commandResult.Result = MoveFileCommandResultKind.Success; return(commandResult); }