Beispiel #1
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);
            }
        }
Beispiel #2
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);
            }
        }