Example #1
0
        /// <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));
            }
        }
Example #2
0
        /// <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));
            }
        }
Example #3
0
 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));
     }
 }
Example #4
0
        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);
        }
Example #5
0
        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"));
        }
Example #6
0
        /// <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));
            }
        }