Ejemplo n.º 1
0
        public void DeleteDirectoryBasic()
        {
            using (var temp = new TestFileCleaner())
            {
                string directoryPath = temp.GetTestPath();
                DirectoryMethods.CreateDirectory(directoryPath);
                using (var directory = FileMethods.CreateFile(directoryPath, 0, ShareMode.FILE_SHARE_READWRITE, CreationDisposition.OPEN_EXISTING,
                                                              FileAttributes.FILE_ATTRIBUTE_DIRECTORY, FileFlags.FILE_FLAG_BACKUP_SEMANTICS))
                {
                    directory.IsInvalid.Should().BeFalse();
                }

                DirectoryMethods.RemoveDirectory(directoryPath);

                Action action = () =>
                {
                    using (var directory = FileMethods.CreateFile(directoryPath, 0, ShareMode.FILE_SHARE_READWRITE, CreationDisposition.OPEN_EXISTING,
                                                                  FileAttributes.FILE_ATTRIBUTE_DIRECTORY, FileFlags.FILE_FLAG_BACKUP_SEMANTICS))
                    {
                    }
                };

                action.ShouldThrow <System.IO.FileNotFoundException>();
            }
        }
Ejemplo n.º 2
0
        public void GetDirectoryFilenames_SpecialDirectories()
        {
            // The "." and ".." entries returned vary quite a bit
            using (var handle = DirectoryMethods.CreateDirectoryHandle(@"C:\"))
            {
                string[] names = FileMethods.GetDirectoryFilenames(handle).ToArray();
                names.Should().NotContain(".");
                names.Should().NotContain("..");
            }

            using (var handle = DirectoryMethods.CreateDirectoryHandle(FileMethods.GetTempPath()))
            {
                string[] names = FileMethods.GetDirectoryFilenames(handle).ToArray();
                names.Should().Contain(".");
                names.Should().NotContain("..");
            }

            using (var cleaner = new TestFileCleaner())
            {
                string directory = cleaner.GetTestPath();
                DirectoryMethods.CreateDirectory(directory);
                using (var handle = DirectoryMethods.CreateDirectoryHandle(FileMethods.GetTempPath()))
                {
                    string[] names = FileMethods.GetDirectoryFilenames(handle).ToArray();
                    names.Should().Contain(".");
                    names.Should().Contain("..");
                }
            }
        }
Ejemplo n.º 3
0
 public static void CreateDirectoryRecursive(string path)
 {
     if (!FileMethods.PathExists(path))
     {
         int lastSeparator = path.LastIndexOfAny(new char[] { Paths.DirectorySeparator, Paths.AltDirectorySeparator });
         CreateDirectoryRecursive(path.Substring(0, lastSeparator));
         DirectoryMethods.CreateDirectory(path);
     }
 }
 public void CreateDirectoryBasic()
 {
     using (var temp = new TestFileCleaner())
     {
         string directoryPath = temp.GetTestPath();
         DirectoryMethods.CreateDirectory(directoryPath);
         using (var directory = DirectoryMethods.CreateDirectoryHandle(directoryPath))
         {
             directory.IsInvalid.Should().BeFalse();
         }
     }
 }
Ejemplo n.º 5
0
        public void FindFileEmptyFolder(string pattern)
        {
            using (var temp = new TestFileCleaner())
            {
                string subdir = Paths.Combine(temp.TempFolder, "Subdir");
                DirectoryMethods.CreateDirectory(subdir);

                FileMethods.CreateFindOperation(subdir, nameFilter: pattern,
                                                findTransform: FindTransforms.ToFileName.Instance, findFilter: FindFilters.All.Instance)
                .Should().Contain(new string[] { ".", ".." });
            }
        }
        public void LockedFileDirectoryDeletion()
        {
            using (var cleaner = new TestFileCleaner())
            {
                string directory = cleaner.GetTestPath();
                DirectoryMethods.CreateDirectory(directory);
                FileMethods.DirectoryExists(directory).Should().BeTrue();
                string file = cleaner.CreateTestFile(nameof(LockedFileDirectoryDeletion), directory);
                using (var handle = FileMethods.CreateFile(file, CreationDisposition.OpenExisting, DesiredAccess.GenericRead, ShareModes.ReadWrite | ShareModes.Delete))
                {
                    handle.IsInvalid.Should().BeFalse();

                    // Mark the file for deletion
                    FileMethods.DeleteFile(file);

                    // RemoveDirectory API call will throw
                    Action action = () => DirectoryMethods.RemoveDirectory(directory);
                    action.ShouldThrow <WInteropIOException>().And.HResult.Should().Be((int)ErrorMacros.HRESULT_FROM_WIN32(WindowsError.ERROR_DIR_NOT_EMPTY));

                    // Opening the directory for deletion will succeed, but have no impact
                    using (var directoryHandle = FileMethods.CreateFile(
                               directory,
                               CreationDisposition.OpenExisting,
                               DesiredAccess.ListDirectory | DesiredAccess.Delete,
                               ShareModes.ReadWrite | ShareModes.Delete,
                               FileAttributes.None,
                               FileFlags.BackupSemantics | FileFlags.DeleteOnClose))
                    {
                        directoryHandle.IsInvalid.Should().BeFalse();
                    }
                }

                // File will be gone now that the handle is closed
                FileMethods.FileExists(file).Should().BeFalse();

                // But the directory will still exist as it doesn't respect DeleteOnClose with an open handle when it is closed
                FileMethods.DirectoryExists(directory).Should().BeTrue();

                // Create a handle to the directory again with DeleteOnClose and it will actually delete the directory
                using (var directoryHandle = FileMethods.CreateFile(
                           directory,
                           CreationDisposition.OpenExisting,
                           DesiredAccess.ListDirectory | DesiredAccess.Delete,
                           ShareModes.ReadWrite | ShareModes.Delete,
                           FileAttributes.None,
                           FileFlags.BackupSemantics | FileFlags.DeleteOnClose))
                {
                    directoryHandle.IsInvalid.Should().BeFalse();
                }
                FileMethods.DirectoryExists(directory).Should().BeFalse();
            }
        }
Ejemplo n.º 7
0
        public unsafe void GetDirectoryFilenamesFromHandle_EmptyDirectory()
        {
            using (var cleaner = new TestFileCleaner())
            {
                string tempDirectory = cleaner.GetTestPath();

                DirectoryMethods.CreateDirectory(tempDirectory);
                using (var handle = DirectoryMethods.CreateDirectoryHandle(tempDirectory))
                {
                    FileMethods.GetDirectoryFilenames(handle).Should().Contain(new string[] { ".", ".." });
                }
            }
        }
Ejemplo n.º 8
0
 public void CreateDirectoryBasic()
 {
     using (var temp = new TestFileCleaner())
     {
         string directoryPath = temp.GetTestPath();
         DirectoryMethods.CreateDirectory(directoryPath);
         using (var directory = FileMethods.CreateFile(directoryPath, 0, ShareMode.FILE_SHARE_READWRITE, CreationDisposition.OPEN_EXISTING,
                                                       FileAttributes.FILE_ATTRIBUTE_DIRECTORY, FileFlags.FILE_FLAG_BACKUP_SEMANTICS))
         {
             directory.IsInvalid.Should().BeFalse();
         }
     }
 }
Ejemplo n.º 9
0
        public unsafe void GetDirectoryFilenamesFromHandle()
        {
            using (var cleaner = new TestFileCleaner())
            {
                string tempDirectory = cleaner.GetTestPath();

                DirectoryMethods.CreateDirectory(tempDirectory);
                FileHelper.WriteAllText(Paths.Combine(tempDirectory, "GetDirectoryFilenamesFromHandle"), "GetDirectoryFilenamesFromHandle");
                using (var handle = DirectoryMethods.CreateDirectoryHandle(tempDirectory))
                {
                    FileMethods.GetDirectoryFilenames(handle).Should().Contain(new string[] { ".", "..", "GetDirectoryFilenamesFromHandle" });
                }
            }
        }
Ejemplo n.º 10
0
        public void CreateDirectoryDirect()
        {
            using (var cleaner = new TestFileCleaner())
            {
                using (var directory = DirectoryMethods.CreateDirectoryHandle(cleaner.TempFolder))
                {
                    directory.IsInvalid.Should().BeFalse();

                    string name = System.IO.Path.GetRandomFileName();
                    using (var subdir = DirectoryMethods.CreateDirectory(directory, name))
                    {
                        subdir.IsInvalid.Should().BeFalse();
                        FileMethods.DirectoryExists(Paths.Combine(cleaner.TempFolder, name)).Should().BeTrue();
                    }
                }
            }
        }
Ejemplo n.º 11
0
        public void OpenDirectoryDirect()
        {
            using (var cleaner = new TestFileCleaner())
            {
                using (var directory = DirectoryMethods.CreateDirectoryHandle(cleaner.TempFolder))
                {
                    directory.IsInvalid.Should().BeFalse("can open the root directory");

                    string name = System.IO.Path.GetRandomFileName();
                    string path = Paths.Combine(cleaner.TempFolder, name);
                    DirectoryMethods.CreateDirectory(path);

                    using (var subdir = DirectoryMethods.CreateDirectoryHandle(directory, name))
                    {
                        subdir.IsInvalid.Should().BeFalse("can open subdir from handle");
                    }
                }
            }
        }
Ejemplo n.º 12
0
        public void FindRecursive()
        {
            using (var cleaner = new TestFileCleaner())
            {
                string subdirA = Paths.Combine(cleaner.TempFolder, "A");
                DirectoryMethods.CreateDirectory(subdirA);
                string fileB = Paths.Combine(subdirA, "B");
                FileHelper.WriteAllText(fileB, "B file");
                string subdirC = Paths.Combine(subdirA, "C");
                DirectoryMethods.CreateDirectory(subdirC);
                string subdirD = Paths.Combine(subdirA, "D");
                DirectoryMethods.CreateDirectory(subdirD);
                string fileE = Paths.Combine(subdirD, "E");
                FileHelper.WriteAllText(fileE, "E file");

                var files = new FindOperation <string>(subdirA, recursive: true).ToArray();
                files.Should().BeEquivalentTo(System.IO.Directory.GetFileSystemEntries(subdirA, "*", System.IO.SearchOption.AllDirectories));
            }
        }
        public void LockedFileDirectoryDeletion2()
        {
            using (var cleaner = new TestFileCleaner())
            {
                string directory = cleaner.GetTestPath();
                DirectoryMethods.CreateDirectory(directory);
                FileMethods.DirectoryExists(directory).Should().BeTrue();
                string file = cleaner.CreateTestFile(nameof(LockedFileDirectoryDeletion2), directory);

                SafeFileHandle directoryHandle = null;
                using (var handle = FileMethods.CreateFile(file, CreationDisposition.OpenExisting, DesiredAccess.GenericRead, ShareModes.ReadWrite | ShareModes.Delete))
                {
                    handle.IsInvalid.Should().BeFalse();

                    // Mark the file for deletion
                    FileMethods.DeleteFile(file);

                    // Open the directory handle
                    directoryHandle = FileMethods.CreateFile(
                        directory,
                        CreationDisposition.OpenExisting,
                        DesiredAccess.ListDirectory | DesiredAccess.Delete,
                        ShareModes.ReadWrite | ShareModes.Delete,
                        FileAttributes.None,
                        FileFlags.BackupSemantics | FileFlags.DeleteOnClose);
                }

                try
                {
                    // File will be gone now that the handle is closed
                    FileMethods.FileExists(file).Should().BeFalse();

                    directoryHandle.Close();

                    // The directory will not exist as the open handle was closed before it was closed
                    FileMethods.DirectoryExists(directory).Should().BeFalse();
                }
                finally
                {
                    directoryHandle?.Close();
                }
            }
        }
Ejemplo n.º 14
0
        public void FindFileEmptyFolder()
        {
            using (var temp = new TestFileCleaner())
            {
                string subdir = System.IO.Path.Combine(temp.TempFolder, "Subdir");
                DirectoryMethods.CreateDirectory(subdir);

                using (var find = FileMethods.CreateFindOperation(subdir + @"\*"))
                {
                    var foundFile = find.GetNextResult();
                    foundFile.Should().NotBeNull();
                    foundFile.FileName.Should().Be(".");
                    foundFile = find.GetNextResult();
                    foundFile.Should().NotBeNull();
                    foundFile.FileName.Should().Be("..");
                    foundFile = find.GetNextResult();
                    foundFile.Should().BeNull();
                }
            }
        }
        public void DeleteDirectoryBasic()
        {
            using (var temp = new TestFileCleaner())
            {
                string directoryPath = temp.GetTestPath();
                DirectoryMethods.CreateDirectory(directoryPath);
                using (var directory = DirectoryMethods.CreateDirectoryHandle(directoryPath))
                {
                    directory.IsInvalid.Should().BeFalse();
                }

                DirectoryMethods.RemoveDirectory(directoryPath);

                Action action = () =>
                {
                    using (var directory = DirectoryMethods.CreateDirectoryHandle(directoryPath))
                    {
                    }
                };

                action.ShouldThrow <System.IO.FileNotFoundException>();
            }
        }