Пример #1
0
        public override object Handle(FileDeleteArguments arguments)
        {
            Guard.NotNull(arguments, nameof(arguments));

            var resolver = new FileResolver(Root);
            FileResolveResult resolveResult = resolver.TryResolveFile(arguments.Path);

            if (resolveResult.ExistingFileOrNull != null)
            {
                DeleteFile(resolveResult.ExistingFileOrNull, resolveResult.ContainingDirectory, arguments);
            }

            return(Missing.Value);
        }
Пример #2
0
        public override bool Handle(EntryExistsArguments arguments)
        {
            Guard.NotNull(arguments, nameof(arguments));

            if (arguments.Path == null)
            {
                return(false);
            }

            var resolver = new FileResolver(Container);
            FileResolveResult resolveResult = resolver.TryResolveFile(arguments.Path);

            return(resolveResult.ExistingFileOrNull != null);
        }
Пример #3
0
        public override IFileStream Handle(FileOpenArguments arguments)
        {
            Guard.NotNull(arguments, nameof(arguments));

            FileAccess fileAccess = DetectFileAccess(arguments);

            AssertValidCombinationOfModeWithAccess(arguments.Mode, fileAccess);

            var resolver = new FileResolver(Root);
            FileResolveResult resolveResult = resolver.TryResolveFile(arguments.Path);

            return(resolveResult.ExistingFileOrNull != null
                ? HandleExistingFile(resolveResult.ExistingFileOrNull, fileAccess, arguments)
                : HandleNewFile(resolveResult.FileName, resolveResult.ContainingDirectory, fileAccess, arguments));
        }
        private FileEntry PrepareDestinationFile([NotNull] FileResolveResult destinationResolveResult,
                                                 [NotNull] FileEntry sourceFile, [NotNull] FileCopyArguments arguments)
        {
            DateTime utcNow = Container.SystemClock.UtcNow();

            FileEntry destinationFile;
            bool      isNewlyCreated;

            if (destinationResolveResult.ExistingFileOrNull != null)
            {
                destinationFile = destinationResolveResult.ExistingFileOrNull;
                isNewlyCreated  = false;

                AssertCanOverwriteFile(arguments.Overwrite, arguments.DestinationPath);
                AssertIsNotHiddenOrReadOnly(destinationFile, arguments.DestinationPath);
                AssertIsNotExternallyEncrypted(destinationFile, arguments.DestinationPath, arguments.IsCopyAfterMoveFailed);
                AssertSufficientDiskSpace(sourceFile.Size - destinationFile.Size,
                                          destinationResolveResult.ContainingDirectory.Root);

                AddChangeForExistingDestinationFile(destinationFile);
            }
            else
            {
                AssertSufficientDiskSpace(sourceFile.Size, destinationResolveResult.ContainingDirectory.Root);

                destinationFile = destinationResolveResult.ContainingDirectory.CreateFile(destinationResolveResult.FileName);
                destinationFile.CreationTimeUtc = utcNow;
                isNewlyCreated = true;
            }

            using (IFileStream createStream = destinationFile.Open(FileMode.Truncate, FileAccess.Write, arguments.DestinationPath,
                                                                   isNewlyCreated, false, false))
            {
                createStream.SetLength(sourceFile.Size);
            }

            destinationFile.SetAttributes(sourceFile.Attributes);

            destinationFile.LastAccessTimeUtc = utcNow;
            destinationFile.LastWriteTimeUtc  = utcNow;

            return(destinationFile);
        }
Пример #5
0
        public override IFileStream Handle(FileCreateArguments arguments)
        {
            Guard.NotNull(arguments, nameof(arguments));
            AssertValidCreationOptions(arguments);

            var resolver = new FileResolver(Root);
            FileResolveResult resolveResult = resolver.TryResolveFile(arguments.Path);

            AssertIsNotHiddenOrReadOnly(resolveResult.ExistingFileOrNull, arguments.Path);

            FileEntry file = resolveResult.ExistingFileOrNull ??
                             resolveResult.ContainingDirectory.CreateFile(resolveResult.FileName);

            if ((arguments.Options & FileOptions.DeleteOnClose) != 0)
            {
                file.EnableDeleteOnClose();
            }

            return(file.Open(FileMode.Create, FileAccess.ReadWrite, arguments.Path));
        }
        public override FileCopyResult Handle(FileCopyArguments arguments)
        {
            Guard.NotNull(arguments, nameof(arguments));

            pendingContentChanges.Clear();
            pendingContentChanges.Add(FileAccessKinds.Write);

            FileEntry sourceFile = ResolveSourceFile(arguments.SourcePath, arguments.IsCopyAfterMoveFailed);

            FileResolveResult destinationResolveResult            = ResolveDestinationFile(arguments);
            DateTime?         existingDestinationLastWriteTimeUtc = destinationResolveResult.ExistingFileOrNull?.LastWriteTimeUtc;
            FileEntry         destinationFile = PrepareDestinationFile(destinationResolveResult, sourceFile, arguments);

            foreach (FileAccessKinds change in pendingContentChanges)
            {
                Container.ChangeTracker.NotifyContentsAccessed(destinationFile.PathFormatter, change);
            }

            IFileStream sourceStream      = null;
            IFileStream destinationStream = null;

            try
            {
                sourceStream      = sourceFile.Open(FileMode.Open, FileAccess.ReadWrite, arguments.SourcePath, false, false, false);
                destinationStream = destinationFile.Open(FileMode.Open, FileAccess.Write, arguments.DestinationPath, false, false,
                                                         false);

                return(new FileCopyResult(sourceFile, sourceStream.AsStream(), destinationFile, destinationStream.AsStream(),
                                          existingDestinationLastWriteTimeUtc));
            }
            catch (Exception)
            {
                destinationStream?.Dispose();
                sourceStream?.Dispose();

                throw;
            }
        }
Пример #7
0
        private FileEntry ResolveDestinationFile([NotNull] AbsolutePath destinationPath, bool overwrite,
                                                 [NotNull] FileEntry sourceFile)
        {
            var destinationResolver = new FileResolver(Root)
            {
                ErrorFileFoundAsDirectory = ErrorFactory.System.TargetIsNotFile
            };
            FileResolveResult resolveResult = destinationResolver.TryResolveFile(destinationPath);

            DateTime utcNow = Root.SystemClock.UtcNow();

            FileEntry destinationFile;

            if (resolveResult.ExistingFileOrNull != null)
            {
                AssertCanOverwriteFile(overwrite, destinationPath);
                AssertIsNotHiddenOrReadOnly(resolveResult.ExistingFileOrNull, destinationPath);

                destinationFile = resolveResult.ContainingDirectory.Files[resolveResult.FileName];
            }
            else
            {
                destinationFile = resolveResult.ContainingDirectory.CreateFile(resolveResult.FileName);
                destinationFile.CreationTimeUtc = utcNow;
            }

            using (IFileStream createStream = destinationFile.Open(FileMode.Truncate, FileAccess.Write, destinationPath))
            {
                createStream.SetLength(sourceFile.Size);
            }

            destinationFile.Attributes = sourceFile.Attributes;

            destinationFile.LastAccessTimeUtc = utcNow;
            destinationFile.LastWriteTimeUtc  = sourceFile.LastWriteTimeUtc;

            return(destinationFile);
        }