/// <summary> /// Create new file in file system /// </summary> /// <param name="context">context for command</param> public Response CreateFile(CommandContext context) { if (!hasOneParameter(context.Args)) { return(Response.Failed("1 аргумент - путь к файлу")); } string filePath = context.Args[0]; lock (_syncCommand) { IDirectory parentDirectory = findParentDirectory(context); if (parentDirectory == null) { return(Response.Failed("Не найдена директория для создания файла")); } string newFileName = Path.GetFileName(filePath); try { parentDirectory.AddFile(new VFSFile() { Name = newFileName }); } catch (IOException) { return(Response.Failed("Файл или директория с таким именем уже существует")); } return(Response.Success(true)); } }
/// <summary> /// Copy file or directory to other directory in file system /// </summary> /// <param name="context">context for command</param> public Response Copy(CommandContext context) { if (!hasTwoParameters(context.Args)) { return(Response.Failed("1 аргумент - путь к директории или файлу, 2 - путь к директории")); } string sourcePath = context.Args[0]; string destPath = context.Args[1]; lock (_syncCommand) { IDirectory destDirectory = FindDirectory(destPath, context.User.CurrentDirectory); IDirectory sourceDirectory = FindDirectory(sourcePath, context.User.CurrentDirectory); if (destDirectory == null) { return(Response.Failed("Не найдена директория, куда нужно скопировать объект")); } if (sourceDirectory == null) { IFile sourceFile = FindFile(sourcePath, context.User.CurrentDirectory); if (sourceFile == null) { return(Response.Failed("Не найден объект для перемещения")); } IFile copiedFile = (IFile)sourceFile.DeepCopy(); copiedFile.LockedUsers.Clear(); try { destDirectory.AddFile(copiedFile); } catch (IOException) { return(Response.Failed("Файл или директория с таким именем уже существует")); } } else { if (sourceDirectory.Parent == null) { return(Response.Failed("Нельзя скопировать корневую директорию")); } IDirectory copiedDirectory = (IDirectory)sourceDirectory.DeepCopy(); copiedDirectory.DeepForEach(d => d.GetDirectories(), d => d.GetFiles().ForEach(f => f.LockedUsers.Clear())); try { destDirectory.AddDirectory(copiedDirectory); } catch (IOException) { return(Response.Failed("Файл или директория с таким именем уже существует")); } } return(Response.Success(true)); } }
private static void AppendChildren(IDirectory dir) { foreach (var subdir in Directory.GetDirectories(dir.FullName)) { AppendChildren(dir.AddDirectory(Path.GetFileName(subdir))); } foreach (var file in Directory.GetFiles(dir.FullName)) { dir.AddFile(Path.GetFileName(file)); } }
public void PrintFileSystem() { // Arrange IFile file11 = CommandHelper.CreateFile("file11"); file11.LockedUsers.AddRange(new string[] { "user1", "user2" }); _child1Directory.AddFile(file11); _file1.LockedUsers.Add("user"); // Act Response actualResult = _engine.Print(_context); // Assert Assert.AreEqual(PrintResults.ExpectedResult, actualResult.Text); }
public void MyTestInitialize() { _engine = new VFSEngine(); _context = CommandHelper.CreateCommandContext(); _rootDirectory = _context.User.CurrentDirectory; _file1 = CommandHelper.CreateFile("file1"); _rootDirectory.AddFile(_file1); _child1Directory = CommandHelper.CreateDirectory("child1"); _child2Directory = CommandHelper.CreateDirectory("child2"); _child3Directory = CommandHelper.CreateDirectory("child3"); _rootDirectory.AddDirectory(_child1Directory); _rootDirectory.AddDirectory(_child2Directory); _rootDirectory.AddDirectory(_child3Directory); _child1Directory.AddDirectory(CommandHelper.CreateDirectory("child11")); _child1Directory.AddDirectory(CommandHelper.CreateDirectory("child12")); _child2Directory.AddDirectory(CommandHelper.CreateDirectory("child21")); _child2Directory.AddDirectory(CommandHelper.CreateDirectory("child22")); }
/// <summary> /// Move file or directory to other directory in file system /// </summary> /// <param name="context">context for command</param> public Response Move(CommandContext context) { if (!hasTwoParameters(context.Args)) { return(Response.Failed("1 аргумент - путь к директории или файлу, 2 - путь к директории")); } string sourcePath = context.Args[0]; string destPath = context.Args[1]; lock (_syncCommand) { IDirectory destDirectory = FindDirectory(destPath, context.User.CurrentDirectory); IDirectory sourceDirectory = FindDirectory(sourcePath, context.User.CurrentDirectory); if (destDirectory == null) { return(Response.Failed("Не найдена директория, куда нужно переместить объект")); } if (sourceDirectory == null) { IFile sourceFile = FindFile(sourcePath, context.User.CurrentDirectory); if (sourceFile == null) { return(Response.Failed("Не найден объект для перемещения")); } if (sourceFile.LockedUsers.Count > 0) { return(Response.Failed("Нельзя переместить заблокированный файл")); } sourceFile.Directory.RemoveFile(sourceFile); try { destDirectory.AddFile(sourceFile); } catch (IOException) { return(Response.Failed("Файл или директория с таким именем уже существует")); } } else { if (sourceDirectory.Parent == null) { return(Response.Failed("Нельзя перемещать корневую директорию")); } if (sourceDirectory.Exists( d => d.GetDirectories(), d => d.GetFiles().Count(f => f.LockedUsers.Count > 0) > 0)) { return(Response.Failed("Невозможно переместить директорию с заблокированными файлами")); } if (sourceDirectory.Exists( d => d.GetDirectories(), d => ((VFSDirectory)d).CountUsers > 0)) { return(Response.Failed("Невозможно переместить директорию, т.к. она или ее поддиректории используется другими пользователями")); } sourceDirectory.Parent.RemoveDirectory(sourceDirectory); try { destDirectory.AddDirectory(sourceDirectory); } catch (IOException) { return(Response.Failed("Файл или директория с таким именем уже существует")); } } return(Response.Success(true)); } }