/// <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)); } }