Пример #1
0
        /// <summary>
        /// Copies the directory.
        /// </summary>
        public void CopyDirectory([NotNull] string path, [NotNull] string newPath, [CanBeNull] IFileSystem destinationSystem = null)
        {
            Validate.ArgumentNotNull(path, "path");
            Validate.ArgumentNotNull(newPath, "newPath");

            var op = new VirtualFileOperations(this, destinationSystem ?? this);
            op.CopyDirectory(path, newPath);
        }
Пример #2
0
        /// <summary>
        /// Copies the file.
        /// </summary>
        public void CopyFile([NotNull] string sourceFileName, [NotNull] string destFileName, [CanBeNull] IFileSystem destinationSystem = null)
        {
            Validate.ArgumentNotNull(sourceFileName, "sourceFileName");
            Validate.ArgumentNotNull(destFileName, "destFileName");

            if (destinationSystem == null || destinationSystem == this)
            {
                File.Copy(sourceFileName, destFileName);
            }
            else
            {
                var operations = new VirtualFileOperations(this, destinationSystem);
                operations.CopyFile(sourceFileName, destFileName);
            }
        }
Пример #3
0
        /// <summary>
        /// Moves the directory.
        /// </summary>
        public void MoveDirectory([NotNull] string sourceDirectory, [NotNull] string destination, [CanBeNull] IFileSystem destinationSystem = null)
        {
            Validate.ArgumentNotNull(sourceDirectory, "sourceDirectory");
            Validate.ArgumentNotNull(destination, "destination");

            if (destinationSystem == null || destinationSystem == this)
            {
                Directory.Move(sourceDirectory, destination);
            }
            else
            {
                var op = new VirtualFileOperations(this, destinationSystem);
                op.MoveDirectory(sourceDirectory, destination);
            }
        }
Пример #4
0
        /// <summary>
        /// Copies the file.
        /// </summary>
        /// <param name="sourceFileName">Name of the source file.</param>
        /// <param name="destFileName">Name of the destination file.</param>
        /// <param name="destinationSystem">The destination system. Optional.</param>
        /// <exception cref="FileNotFoundException">Cannot find source file to copy.</exception>
        /// <exception cref="DirectoryNotFoundException">Specified destination path does not exist.</exception>
        public void CopyFile([NotNull] string sourceFileName, [NotNull] string destFileName, [CanBeNull] IFileSystem destinationSystem = null)
        {
            Validate.ArgumentNotNull(sourceFileName, "sourceFileName");
            Validate.ArgumentNotNull(destFileName, "destFileName");

            CheckDisposed();

            // destination and source must be file names. directory names are not supported (same as native io).
            bool sameSystem = destinationSystem == null || destinationSystem == this;

            // move inside same volume
            if (sameSystem && sourceFileName == destFileName)
            {
                return;
            }

            if (sameSystem)
            {
                var sourceVfn = new VirtualFileName(sourceFileName);
                using (var srcResult = FindNode(sourceVfn, false)) // lock file for reading, we're copying
                {
                    var sourceFile = srcResult.File;
                    if (sourceFile == null)
                    {
                        throw new FileNotFoundException("Cannot find source file to copy.", sourceFileName);
                    }

                    var vfn = new VirtualFileName(destFileName);

                    // lock destination dir for writing - new file will be created there.
                    using (var destResult = FindNode(vfn, true, true))
                    {
                        var parentDir = destResult.Directory;
                        if (parentDir == null)
                        {
                            throw new DirectoryNotFoundException("Specified destination path does not exist.");
                        }

                        var destFile = _record.CreateFileNode(vfn.Name, parentDir);
                        using (NodeLocker.Lock(destFile, true))
                        {
                            CopyNodeData(sourceFile, destFile);
                        }
                    }
                }
            }
            else
            {
                var operations = new VirtualFileOperations(this, destinationSystem);
                operations.CopyFile(sourceFileName, destFileName);
            }
        }
Пример #5
0
        /// <summary>
        /// Copies the directory to new destination.
        /// </summary>
        /// <param name="sourceDirectory">The source directory name. Must reference existing directory.</param>
        /// <param name="destination">The destination directory name. That is the name of directory which will be created.</param>
        /// <param name="destinationSystem">The destination system. Optional.</param>
        public void CopyDirectory([NotNull] string sourceDirectory, [NotNull] string destination, [CanBeNull] IFileSystem destinationSystem = null)
        {
            Validate.ArgumentNotNull(sourceDirectory, "sourceDirectory");
            Validate.ArgumentNotNull(destination, "destination");

            CheckDisposed();

            // implemented as a set of simple operations.
            var operations = new VirtualFileOperations(this, destinationSystem ?? this);
            operations.CopyDirectory(sourceDirectory, destination);
        }
Пример #6
0
        /// <summary>
        /// Moves or renames the file.
        /// </summary>
        /// <param name="sourceFileName">Name of the source file.</param>
        /// <param name="destFileName">New name and path of moved file.</param>
        /// <param name="destinationSystem">The destination system. Optional.</param>
        /// <exception cref="FileNotFoundException">Cannot find source file to move.</exception>
        /// <exception cref="DirectoryNotFoundException">Cannot find destination directory for move operation.</exception>
        /// <exception cref="IOException">Destination file already exists.</exception>
        public void MoveFile([NotNull] string sourceFileName, [NotNull] string destFileName, [CanBeNull] IFileSystem destinationSystem = null)
        {
            Validate.ArgumentNotNull(sourceFileName, "sourceFileName");
            Validate.ArgumentNotNull(destFileName, "destFileName");

            CheckDisposed();

            // destination and source must be file names. directory names are not supported (same as native io).
            bool sameSystem = destinationSystem == null || destinationSystem == this;

            // move inside same volume
            if (sameSystem && sourceFileName == destFileName)
            {
                return;
            }

            if (sameSystem)
            {
                var sourceVfn = new VirtualFileName(sourceFileName);
                var destVfn = new VirtualFileName(destFileName);

                NodeLocker srcResult;
                NodeLocker destResult;

                if (string.Equals(sourceVfn.Path, destVfn.Path, StringComparison.InvariantCultureIgnoreCase))
                {
                    // same folder, rename file.
                    srcResult = destResult = FindNode(sourceVfn, true, true);
                }
                else if (sourceVfn.AllSegments.Count() > destVfn.AllSegments.Count())
                {
                    // lock longer path first
                    srcResult = FindNode(sourceVfn, true, true);
                    destResult = FindNode(destVfn, true, true);
                }
                else
                {
                    destResult = FindNode(destVfn, true, true);
                    srcResult = FindNode(sourceVfn, true, true);
                }

                using (srcResult)
                {
                    var sourceDir = srcResult.Directory;
                    if (sourceDir == null)
                    {
                        throw new FileNotFoundException("Cannot find source file to move.", sourceFileName);
                    }

                    using (destResult)
                    {
                        var destDir = destResult.Directory;
                        if (destDir == null)
                        {
                            throw new DirectoryNotFoundException("Cannot find destination directory for move operation.");
                        }

                        if (destDir.FindChildEntry(destVfn.Name) != null)
                        {
                            throw new IOException("Destination file already exists.");
                        }

                        var sourceFile = sourceDir.FindChildEntry(sourceVfn.Name);
                        if (sourceFile == null || sourceFile is DirectoryNode)
                        {
                            throw new FileNotFoundException("Cannot find source file to move.", sourceFileName);
                        }

                        using (NodeLocker.Lock(sourceFile, true))
                        {
                            sourceDir.FindAndRemoveChildEntry(sourceVfn.Name, false);
                            destDir.AddChildEntry(destVfn.Name, false, sourceFile.Address);
                        }
                    }
                }
            }
            else
            {
                var operations = new VirtualFileOperations(this, destinationSystem);
                operations.MoveFile(sourceFileName, destFileName);
            }
        }