예제 #1
0
        /// <summary>
        /// Переименовывает указанный файл.
        /// </summary>
        /// <param name="fullPathForFile">Путь, указывающий файл для переименования.</param>
        /// <param name="newFileName">Новое имя файла (без пути).</param>
        /// <exception cref="FileAlreadyExistsException"></exception>
        /// <exception cref="InvalidPathException"></exception>
        /// <exception cref="FileNotFoundException"></exception>
        /// <exception cref="ArgumentNullException"></exception>
        /// <exception cref="ObjectDisposedException"></exception>
        /// <exception cref="InvalidNameException"></exception>
        /// <exception cref="FileLockedException"></exception>
        public void RenameFile(string fullPathForFile, string newFileName)
        {
            MethodArgumentValidator.ThrowIfStringIsNullOrEmpty(fullPathForFile, "fullPathForFile");
            MethodArgumentValidator.ThrowIfStringIsNullOrEmpty(newFileName, "newFileName");

            if (_pathBuilder.PointsToRoot(fullPathForFile))
            {
                throw new InvalidPathException("Файл не был переименован: имя файла, который следует переименовать, не может указывать на корень файловой системы");
            }

            _nameValidator.Validate(newFileName);

            try
            {
                string fileName;

                var parentFolderResolvingResult = _nodeResolver.ResolveParentFolderNodeByPath(fullPathForFile, out fileName);

                string lastPartOfFullPath = _pathBuilder.GetFileOrFolderName(fullPathForFile);

                if (_namesComparer.Equals(newFileName, lastPartOfFullPath))
                {
                    return;
                }

                ReadOnlyCollection <FileNode> files;
                FileNode fileNode = this.ResolveFileNodeThrowingUserFriendlyErrors(fullPathForFile, parentFolderResolvingResult, fileName, "переименовать", out files);

                if (files.Any(node => _namesComparer.Equals(newFileName, node.Name)))
                {
                    throw new FileAlreadyExistsException("Не удалось переименовать файл: файл с именем \"{0}\" уже существует в папке, где вы производите переименование".FormatWith(newFileName));
                }

                fileNode.Name = newFileName;

                _fileSystemNodeStorage.WriteNode(fileNode);

                _folderEnumeratorRegistry.InvalidateEnumeratorsFor(parentFolderResolvingResult.FoldersPassedWhileResolving);
                _folderEnumeratorRegistry.InvalidateEnumeratorsForFolder(parentFolderResolvingResult.ResolvedNode.Id);
            }
            catch (CannotResolvePathException)
            {
                throw new FileNotFoundException("Не удалось найти файл {0}".FormatWith(fullPathForFile));
            }
            catch (InvalidPathException)
            {
                throw new FileNotFoundException("Не удалось найти файл {0}".FormatWith(fullPathForFile));
            }
        }
        /// <summary>
        /// Переименовывает папку.
        /// </summary>
        /// <param name="fullPathForFolder">Путь, указывающий папку, которую следует переименовать.</param>
        /// <param name="newFolderName">Новое имя папки (только имя - без пути)</param>
        /// <exception cref="FolderAlreadyExistsException"></exception>
        /// <exception cref="InvalidPathException"></exception>
        /// <exception cref="FolderNotFoundException"></exception>
        /// <exception cref="FolderLockedException"></exception>
        /// <exception cref="ObjectDisposedException"></exception>
        /// <exception cref="InvalidNameException"></exception>
        public void RenameFolder(string fullPathForFolder, string newFolderName)
        {
            MethodArgumentValidator.ThrowIfStringIsNullOrEmpty(fullPathForFolder, "fullPathForFolder");
            MethodArgumentValidator.ThrowIfStringIsNullOrEmpty(newFolderName, "newFolderName");

            if (_pathBuilder.PointsToRoot(fullPathForFolder))
            {
                throw new InvalidPathException("Папка не была переименована: имя папки не может указывать на корень файловой системы");
            }

            _nameValidator.Validate(newFolderName);

            try
            {
                string folderName;

                var parentFolderResolvingResult = _nodeResolver.ResolveParentFolderNodeByPath(fullPathForFolder,
                                                                                              out folderName);

                string lastPartOfFullPath = _pathBuilder.GetFileOrFolderName(newFolderName);

                if (_namesComparer.Equals(folderName, lastPartOfFullPath))
                {
                    return;
                }

                FolderNode parentFolderNode = parentFolderResolvingResult.ResolvedNode;

                ReadOnlyCollection <FolderNode> folders = _nodeResolver.GetAllFoldersFrom(parentFolderNode);

                FolderNode folderNode = folders.FirstOrDefault(node => _namesComparer.Equals(node.Name, folderName));

                if (folderNode == null)
                {
                    throw new FolderNotFoundException("Не найдена папка для переименования (\"{0}\")".FormatWith(fullPathForFolder));
                }

                if (_lockingManager.IsNodeLockedForRenamesAndMoves(folderNode))
                {
                    throw new FolderLockedException("Не удалось переименовать папку. В ней (или в одной из ее поддиректорий) есть файлы, которые сейчас открыты.");
                }

                if (folders.Any(node => _namesComparer.Equals(newFolderName, node.Name)))
                {
                    throw new FolderAlreadyExistsException("Не удалось переименовать папку: папка с именем \"{0}\" уже существует в директории, где вы производите переименование".FormatWith(newFolderName));
                }

                var idsOfFolderUnderGivenOne = _nodeResolver.GetIdsOfAllFoldersUnderGivenOne(fullPathForFolder);

                folderNode.Name = newFolderName;

                _fileSystemNodeStorage.WriteNode(folderNode);

                _folderEnumeratorRegistry.InvalidateEnumeratorsFor(parentFolderResolvingResult.FoldersPassedWhileResolving);
                _folderEnumeratorRegistry.InvalidateEnumeratorsForFolder(parentFolderResolvingResult.ResolvedNode.Id);
                _folderEnumeratorRegistry.InvalidateEnumeratorsFor(idsOfFolderUnderGivenOne);
            }
            catch (CannotResolvePathException)
            {
                throw new FileNotFoundException("Не удалось найти папку по указанному пути (\"{0}\")".FormatWith(fullPathForFolder));
            }
            catch (InvalidPathException)
            {
                throw new FileNotFoundException("Не удалось найти папку по указанному пути (\"{0}\")".FormatWith(fullPathForFolder));
            }
        }