public override FileActionStatus Save(FileDefinition fileDefinition, ContainerDefinition containerDefinition,
                                              FileCreateOptions fileCreateOptions,
                                              ContainerCreateOptions containerCreateOptions)
        {
            var status = new FileActionStatus();

            // If we aren't allowing auto creation of directories, fail
            if (!Directory.Exists(containerDefinition.Path) && !_createPathsAutomatically)
            {
                status.Status  = Status.NoAction;
                status.Message = Constants.Messages.NoAction +
                                 " Path does not exist, and config to create paths automatically is false.";
                return(status);
            }

            // Create directory if it doesn't exist
            Directory.CreateDirectory(containerDefinition.Path);

            var path = GetFullFilePath(fileDefinition, containerDefinition);

            // Overwrite based on provided option
            if (!fileCreateOptions.OverwriteExisting && File.Exists(path))
            {
                status.Status  = Status.NoAction;
                status.Message = Constants.Messages.NoAction +
                                 " File already exists; must explicitly set option to overwrite.";
                return(status);
            }

            SaveFile(path, fileDefinition.Data).Wait();

            status.Status  = Status.Success;
            status.Message = Constants.Messages.Success;
            return(status);
        }
        public override FileActionStatus Delete(FileDefinition fileDefinition, ContainerDefinition containerDefinition)
        {
            var status = new FileActionStatus();
            var path   = GetFullFilePath(fileDefinition, containerDefinition);

            // Fail early if file doesn't exist
            if (!File.Exists(path))
            {
                status.Status  = Status.NoAction;
                status.Message = Constants.Messages.FileDoesNotExist;
                return(status);
            }

            try
            {
                File.Delete(path);
                if (_removeEmptyPathsOnDelete)
                {
                    RemoveEmptyDirectories(containerDefinition.Path);
                }
            }
            catch (Exception)
            {
                status.Status  = Status.NoAction;
                status.Message = Constants.Messages.NoAction;
            }

            status.Status  = Status.Success;
            status.Message = Constants.Messages.Success;
            return(status);
        }
        public override FileActionStatus Move(FileDefinition fileDefinition, ContainerDefinition containerDefinition,
                                              ContainerDefinition newContainerDefinition, string newFileName = null)
        {
            var status            = new FileActionStatus();
            var newFileDefinition = new FileDefinition {
                Name = newFileName ?? fileDefinition.Name
            };
            // Don't clone fileDefinition since we don't need the data here, just the name

            var oldPath = GetFullFilePath(fileDefinition, containerDefinition);
            var newPath = GetFullFilePath(newFileDefinition, newContainerDefinition);

            // Fail early if file doesn't exist
            if (!File.Exists(oldPath))
            {
                status.Status  = Status.NoAction;
                status.Message = Constants.Messages.FileDoesNotExist;
                return(status);
            }

            try
            {
                // If we aren't allowing auto creation of directories, fail
                if (!Directory.Exists(newContainerDefinition.Path) && !_createPathsAutomatically)
                {
                    status.Status  = Status.NoAction;
                    status.Message = Constants.Messages.NoAction +
                                     " Destination path does not exist, and config to create paths automatically is false.";
                    return(status);
                }
                Directory.CreateDirectory(newContainerDefinition.Path);
                File.Move(oldPath, newPath);
                if (_removeEmptyPathsOnMove)
                {
                    RemoveEmptyDirectories(containerDefinition.Path);
                }
            }
            catch (Exception)
            {
                status.Status  = Status.NoAction;
                status.Message = Constants.Messages.NoAction;
            }

            status.Status  = Status.Success;
            status.Message = Constants.Messages.Success;
            return(status);
        }
        public override FileActionStatus TryRead(FileDefinition fileDefinition, ContainerDefinition containerDefinition,
                                                 out byte[] data)
        {
            var status = new FileActionStatus();
            var path   = GetFullFilePath(fileDefinition, containerDefinition);

            try
            {
                data           = File.ReadAllBytes(path);
                status.Status  = Status.Success;
                status.Message = Constants.Messages.Success;
            }
            catch (Exception)
            {
                data           = null;
                status.Status  = Status.NoAction;
                status.Message = Constants.Messages.NoAction;
            }
            return(status);
        }