コード例 #1
0
        /// <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);
        }