Exemple #1
0
        public static void foo()
        {
            Person person = new Person {
                Age = 25, Name = "Larry", Salary = 12500.50
            };
            string path     = Directory.GetCurrentDirectory();
            string fileName = @"person.json";

            string json = JsonSerializer.Serialize(person);

            Console.WriteLine($"Person в JSON: {json}");

            FileMethods.WriteFile(path, fileName, json);

            string jsonFromFile   = FileMethods.ReadFile(path, fileName);
            Person personFromJson = JsonSerializer.Deserialize <Person>(jsonFromFile);

            Console.WriteLine(personFromJson);


            Console.WriteLine("Нажмите любую кнопку для удаления файла...");
            Console.ReadKey(true);
            FileMethods.DeleteFile(path, fileName);

            Console.WriteLine("========================");
        }
        public void GetFileAttributesBehavior_DeletedFile()
        {
            using (var cleaner = new TestFileCleaner())
            {
                string path = cleaner.CreateTestFile(nameof(GetFileAttributesBehavior_DeletedFile));
                using (var handle = FileMethods.CreateFile(path, CreationDisposition.OpenExisting, shareMode: ShareModes.All))
                {
                    handle.IsInvalid.Should().BeFalse();
                    FileMethods.FileExists(path).Should().BeTrue();
                    FileMethods.DeleteFile(path);

                    // With the file deleted and the handle still open the file will still physically exist.
                    // Trying to access the file via a handle at this point will fail with access denied.

                    Action action = () => FileMethods.FileExists(path);
                    action.ShouldThrow <UnauthorizedAccessException>();

                    action = () => FileMethods.CreateFile(path, CreationDisposition.OpenExisting, shareMode: ShareModes.All,
                                                          desiredAccess: DesiredAccess.ReadAttributes);
                    action.ShouldThrow <UnauthorizedAccessException>();

                    // Find file will work at this point.
                    IntPtr findHandle = FileMethods.Imports.FindFirstFileW(path, out WIN32_FIND_DATA findData);
                    findHandle.Should().NotBe(IntPtr.Zero);
                    try
                    {
                        findData.cFileName.CreateString().Should().Be(Paths.GetLastSegment(path));
                    }
                    finally
                    {
                        FileMethods.Imports.FindClose(findHandle);
                    }
                }
            }
        }
Exemple #3
0
        private static void CleanOrphanedTempFolders()
        {
            // Clean up orphaned temp folders
            DirectoryInfo rootInfo = new DirectoryInfo(s_rootTempFolder);

            if (rootInfo != null)
            {
                try
                {
                    var flagFiles =
                        from directory in rootInfo.EnumerateDirectories()
                        from file in directory.EnumerateFiles(WinteropFlagFileName)
                        select new { Directory = directory.FullName, File = file.FullName };

                    foreach (var flagFile in flagFiles.ToArray())
                    {
                        try
                        {
                            // If we can't delete the flag file (open handle) we'll throw and move on
                            FileMethods.DeleteFile(@"\\?\" + flagFile.File);

                            FileHelper.DeleteDirectoryRecursive(@"\\?\" + flagFile.Directory);
                        }
                        catch (Exception)
                        {
                        }
                    }
                }
                catch (Exception)
                {
                    // Ignoring orphan cleanup errors as the DotNet file service chokes on long paths
                }
            }
        }
Exemple #4
0
        public void GetBasicInfoByHandleBasic()
        {
            string tempPath     = FileMethods.GetTempPath();
            string tempFileName = System.IO.Path.Combine(tempPath, System.IO.Path.GetRandomFileName());

            try
            {
                using (var directory = FileMethods.CreateFile(tempPath, DesiredAccess.GENERIC_READ, ShareMode.FILE_SHARE_READWRITE, CreationDisposition.OPEN_EXISTING,
                                                              FileAttributes.NONE, FileFlags.FILE_FLAG_BACKUP_SEMANTICS))
                {
                    var directoryInfo = FileMethods.GetFileBasicInfoByHandle(directory);
                    directoryInfo.Attributes.Should().HaveFlag(FileAttributes.FILE_ATTRIBUTE_DIRECTORY);

                    using (var file = FileMethods.CreateFile(tempFileName, DesiredAccess.GENERIC_READ | DesiredAccess.GENERIC_WRITE, ShareMode.FILE_SHARE_READWRITE, CreationDisposition.CREATE_NEW))
                    {
                        var fileInfo = FileMethods.GetFileBasicInfoByHandle(file);
                        fileInfo.Attributes.Should().NotHaveFlag(FileAttributes.FILE_ATTRIBUTE_DIRECTORY);
                        fileInfo.CreationTime.Should().BeAfter(directoryInfo.CreationTime);
                    }
                }
            }
            finally
            {
                FileMethods.DeleteFile(tempFileName);
            }
        }
Exemple #5
0
        public void GetStandardInfoByHandleBasic()
        {
            string tempPath     = FileMethods.GetTempPath();
            string tempFileName = System.IO.Path.Combine(tempPath, System.IO.Path.GetRandomFileName());

            try
            {
                using (var directory = FileMethods.CreateFile(tempPath, DesiredAccess.GENERIC_READWRITE, ShareMode.FILE_SHARE_READWRITE, CreationDisposition.OPEN_EXISTING,
                                                              FileAttributes.NONE, FileFlags.FILE_FLAG_BACKUP_SEMANTICS))
                {
                    var info = FileMethods.GetFileStandardInfoByHandle(directory);
                    info.Directory.Should().BeTrue();
                }

                using (var file = FileMethods.CreateFile(tempFileName, DesiredAccess.GENERIC_READWRITE, ShareMode.FILE_SHARE_READWRITE, CreationDisposition.CREATE_NEW))
                {
                    var info = FileMethods.GetFileStandardInfoByHandle(file);
                    info.Directory.Should().BeFalse();
                    info.NumberOfLinks.Should().Be(1);
                    info.DeletePending.Should().BeFalse();
                    info.AllocationSize.Should().Be(0);
                    info.EndOfFile.Should().Be(0);
                }
            }
            finally
            {
                FileMethods.DeleteFile(tempFileName);
            }
        }
Exemple #6
0
        public void GetStreamInfoByHandleBasic()
        {
            string tempPath     = FileMethods.GetTempPath();
            string tempFileName = System.IO.Path.Combine(tempPath, System.IO.Path.GetRandomFileName());

            try
            {
                using (var directory = FileMethods.CreateFile(tempPath, DesiredAccess.GENERIC_READ, ShareMode.FILE_SHARE_READWRITE, CreationDisposition.OPEN_EXISTING,
                                                              FileAttributes.NONE, FileFlags.FILE_FLAG_BACKUP_SEMANTICS))
                {
                    var directoryInfo = FileMethods.GetStreamInformationByHandle(directory);
                    directoryInfo.Should().BeEmpty();

                    using (var file = FileMethods.CreateFile(tempFileName, DesiredAccess.GENERIC_READ | DesiredAccess.GENERIC_WRITE, ShareMode.FILE_SHARE_READWRITE, CreationDisposition.CREATE_NEW))
                    {
                        var fileInfo = FileMethods.GetStreamInformationByHandle(file);
                        fileInfo.Should().HaveCount(1);
                        var info = fileInfo.First();
                        info.Name.Should().Be(@"::$DATA");
                        info.Size.Should().Be(0);
                        info.AllocationSize.Should().Be(0);
                    }
                }
            }
            finally
            {
                FileMethods.DeleteFile(tempFileName);
            }
        }
Exemple #7
0
        public void GetShortNameBasic()
        {
            string tempPath = FileMethods.GetTempPath();

            using (var directory = FileMethods.CreateFile(tempPath, DesiredAccess.GENERIC_READ, ShareMode.FILE_SHARE_READWRITE, CreationDisposition.OPEN_EXISTING,
                                                          FileAttributes.NONE, FileFlags.FILE_FLAG_BACKUP_SEMANTICS))
            {
                // This will give back the NT volume path (\Device\HarddiskVolumen\)
                string directoryName = FileDesktopMethods.GetShortName(directory);
                directoryName.Should().Be("Temp");

                string tempFileName = "ExtraLongName" + System.IO.Path.GetRandomFileName();
                string tempFilePath = System.IO.Path.Combine(tempPath, tempFileName);
                try
                {
                    using (var file = FileMethods.CreateFile(tempFilePath, DesiredAccess.GENERIC_READ, ShareMode.FILE_SHARE_READWRITE, CreationDisposition.CREATE_NEW))
                    {
                        string fileName = FileDesktopMethods.GetShortName(file);
                        fileName.Length.Should().BeLessOrEqualTo(12);
                    }
                }
                finally
                {
                    FileMethods.DeleteFile(tempFilePath);
                }
            }
        }
        public void GetShortNameBasic()
        {
            string tempPath = FileMethods.GetTempPath();

            using (var directory = DirectoryMethods.CreateDirectoryHandle(tempPath))
            {
                // This will give back the NT volume path (\Device\HarddiskVolumen\)
                string directoryName = FileMethods.GetShortName(directory);
                directoryName.Should().Be("Temp");

                string tempFileName = "ExtraLongName" + System.IO.Path.GetRandomFileName();
                string tempFilePath = System.IO.Path.Combine(tempPath, tempFileName);
                try
                {
                    using (var file = FileMethods.CreateFile(tempFilePath, CreationDisposition.CreateNew, DesiredAccess.GenericRead))
                    {
                        string fileName = FileMethods.GetShortName(file);
                        fileName.Length.Should().BeLessOrEqualTo(12);
                    }
                }
                finally
                {
                    FileMethods.DeleteFile(tempFilePath);
                }
            }
        }
Exemple #9
0
        private void CleanOwnFiles()
        {
            lock (s_CleanLock)
            {
                _flagFile.Dispose();
                _flagFile = null;

                // Delete our own temp folder
                try
                {
                    FileHelper.DeleteDirectoryRecursive(@"\\?\" + TempFolder);
                }
                catch (Exception)
                {
                }

                // Clean any loose files we're tracking
                foreach (string file in _filesToClean.Distinct(StringComparer.OrdinalIgnoreCase))
                {
                    if (string.IsNullOrWhiteSpace(file))
                    {
                        continue;
                    }

                    try
                    {
                        FileMethods.DeleteFile(@"\\?\" + file);
                    }
                    catch (Exception)
                    {
                    }
                }
            }
        }
        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();
            }
        }
Exemple #11
0
        public static void DeleteDirectoryRecursive(string path)
        {
            var data = FileMethods.TryGetFileInfo(path);

            if (!data.HasValue)
            {
                // Nothing found
                throw ErrorHelper.GetIoExceptionForError(WindowsError.ERROR_PATH_NOT_FOUND, path);
            }

            if ((data.Value.Attributes & FileAttributes.FILE_ATTRIBUTE_DIRECTORY) != FileAttributes.FILE_ATTRIBUTE_DIRECTORY)
            {
                // Not a directory, a file
                throw ErrorHelper.GetIoExceptionForError(WindowsError.ERROR_FILE_EXISTS, path);
            }

            if ((data.Value.Attributes & FileAttributes.FILE_ATTRIBUTE_READONLY) == FileAttributes.FILE_ATTRIBUTE_READONLY)
            {
                // Make it writable
                FileMethods.SetFileAttributes(path, data.Value.Attributes & ~FileAttributes.FILE_ATTRIBUTE_READONLY);
            }

            // Reparse points don't need to be empty to be deleted. Deleting will simply disconnect the reparse point, which is what we want.
            if ((data.Value.Attributes & FileAttributes.FILE_ATTRIBUTE_REPARSE_POINT) != FileAttributes.FILE_ATTRIBUTE_REPARSE_POINT)
            {
                using (FindOperation findOperation = new FindOperation(Paths.Combine(path, "*")))
                {
                    FindResult findResult;
                    while ((findResult = findOperation.GetNextResult()) != null)
                    {
                        if (findResult.FileName != "." && findResult.FileName != "..")
                        {
                            bool isDirectory = (findResult.Attributes & FileAttributes.FILE_ATTRIBUTE_DIRECTORY) == FileAttributes.FILE_ATTRIBUTE_DIRECTORY;

                            if (isDirectory)
                            {
                                DeleteDirectoryRecursive(Paths.Combine(path, findResult.FileName));
                            }
                            else
                            {
                                FileMethods.DeleteFile(Paths.Combine(path, findResult.FileName));
                            }
                        }
                    }
                }
            }

            // We've either emptied or we're a reparse point, delete the directory
            DirectoryMethods.RemoveDirectory(path);
        }
Exemple #12
0
        public void GetTempFileNameBasic()
        {
            string tempPath     = FileMethods.GetTempPath();
            string tempFileName = FileMethods.GetTempFileName(tempPath, "tfn");

            try
            {
                tempFileName.Should().StartWith(tempPath);
            }
            finally
            {
                FileMethods.DeleteFile(tempFileName);
            }
        }
Exemple #13
0
        public static void foo()
        {
            string path     = Directory.GetCurrentDirectory();
            string fileName = @"text.txt";

            FileMethods.WriteFile(fileName, path);
            Console.WriteLine($"Текст файла:\n{FileMethods.ReadFile(path, fileName)}");

            Console.WriteLine("Нажмите любую кнопку для удаления файла...");
            Console.ReadKey(true);

            FileMethods.DeleteFile(path, fileName);

            Console.WriteLine("========================");
        }
Exemple #14
0
        public void DeleteFileBasic()
        {
            string tempPath     = FileMethods.GetTempPath();
            string tempFileName = FileMethods.GetTempFileName(tempPath, "tfn");

            try
            {
                System.IO.File.Exists(tempFileName).Should().BeTrue();
            }
            finally
            {
                FileMethods.DeleteFile(tempFileName);
                System.IO.File.Exists(tempFileName).Should().BeFalse();
            }
        }
Exemple #15
0
        public void FlushFileBuffersBasic()
        {
            string tempPath     = FileMethods.GetTempPath();
            string tempFileName = System.IO.Path.Combine(tempPath, System.IO.Path.GetRandomFileName());

            try
            {
                using (var file = FileMethods.CreateFile(tempFileName, DesiredAccess.GENERIC_READWRITE, ShareMode.FILE_SHARE_READWRITE, CreationDisposition.CREATE_NEW))
                {
                    FileMethods.FlushFileBuffers(file);
                }
            }
            finally
            {
                FileMethods.DeleteFile(tempFileName);
            }
        }
        public void CreateFileBasic()
        {
            string tempPath     = FileMethods.GetTempPath();
            string tempFileName = FileMethods.GetTempFileName(tempPath, "tfn");

            try
            {
                using (var file = FileMethods.CreateFile(tempFileName, CreationDisposition.OpenExisting, DesiredAccess.GenericRead))
                {
                    file.IsInvalid.Should().BeFalse();
                }
            }
            finally
            {
                FileMethods.DeleteFile(tempFileName);
            }
        }
Exemple #17
0
        public void CreateFileBasic()
        {
            string tempPath     = FileMethods.GetTempPath();
            string tempFileName = FileMethods.GetTempFileName(tempPath, "tfn");

            try
            {
                using (var file = FileMethods.CreateFile(tempFileName, DesiredAccess.GENERIC_READ, ShareMode.FILE_SHARE_READWRITE, CreationDisposition.OPEN_EXISTING))
                {
                    file.IsInvalid.Should().BeFalse();
                }
            }
            finally
            {
                FileMethods.DeleteFile(tempFileName);
            }
        }
Exemple #18
0
        public void CreateFileCreateTempFile()
        {
            string tempPath     = FileMethods.GetTempPath();
            string tempFileName = System.IO.Path.Combine(tempPath, System.IO.Path.GetRandomFileName());

            try
            {
                using (var file = FileMethods.CreateFile(tempFileName, DesiredAccess.GENERIC_READ, ShareMode.FILE_SHARE_READWRITE, CreationDisposition.CREATE_NEW))
                {
                    file.IsInvalid.Should().BeFalse();
                    System.IO.File.Exists(tempFileName).Should().BeTrue();
                }
            }
            finally
            {
                FileMethods.DeleteFile(tempFileName);
            }
        }
Exemple #19
0
        public static void foo()
        {
            string path     = Directory.GetCurrentDirectory();
            string fileName = "base.xml";

            /*Генерация XML-файла*/
            XDocument doc = new XDocument(
                new XElement("users",
                             new XElement("user",
                                          new XElement("name", "Mark Zuckerberg"),
                                          new XElement("age", "45"),
                                          new XElement("salary", "125000.00")),
                             new XElement("user",
                                          new XElement("name", "Bill Gates"),
                                          new XElement("age", "48"),
                                          new XElement("salary", "205000.00")),
                             new XElement("user",
                                          new XElement("name", "Larry Page"),
                                          new XElement("age", "50"),
                                          new XElement("salary", "127500.00"))
                             )
                );

            doc.Save($"{path}\\{fileName}");

            /*Чтение файла*/
            if (doc.Root != null)
            {
                foreach (var user in doc.Root.Elements())
                {
                    Console.WriteLine($"{user.Name}");
                    foreach (var userElem in user.Elements())
                    {
                        Console.WriteLine($" {userElem.Name}: {userElem.Value}");
                    }
                }
            }

            Console.WriteLine("Нажмите любую кнопку для удаления файла...");
            Console.ReadKey(true);
            FileMethods.DeleteFile(path, fileName);

            Console.WriteLine("========================");
        }
        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();
                }
            }
        }
Exemple #21
0
        public static void DeleteDirectoryRecursive(string path)
        {
            var data = FileMethods.TryGetFileInfo(path);

            if (!data.HasValue)
            {
                // Nothing found
                throw Errors.GetIoExceptionForError(WindowsError.ERROR_PATH_NOT_FOUND, path);
            }

            if ((data.Value.dwFileAttributes & FileAttributes.Directory) != FileAttributes.Directory)
            {
                // Not a directory, a file
                throw Errors.GetIoExceptionForError(WindowsError.ERROR_FILE_EXISTS, path);
            }

            if ((data.Value.dwFileAttributes & FileAttributes.ReadOnly) == FileAttributes.ReadOnly)
            {
                // Make it writable
                FileMethods.SetFileAttributes(path, data.Value.dwFileAttributes & ~FileAttributes.ReadOnly);
            }

            // Reparse points don't need to be empty to be deleted. Deleting will simply disconnect the reparse point, which is what we want.
            if ((data.Value.dwFileAttributes & FileAttributes.ReparsePoint) != FileAttributes.ReparsePoint)
            {
                foreach (FindResult findResult in new FindOperation <FindResult>(path))
                {
                    if ((findResult.Attributes & FileAttributes.Directory) == FileAttributes.Directory)
                    {
                        DeleteDirectoryRecursive(Paths.Combine(path, findResult.FileName));
                    }
                    else
                    {
                        FileMethods.DeleteFile(Paths.Combine(path, findResult.FileName));
                    }
                }
            }

            // We've either emptied or we're a reparse point, delete the directory
            DirectoryMethods.RemoveDirectory(path);
        }
Exemple #22
0
        public void SetFileAttributesBasic()
        {
            string tempPath     = FileMethods.GetTempPath();
            string tempFileName = FileMethods.GetTempFileName(tempPath, "tfn");

            try
            {
                var originalInfo = FileMethods.GetFileAttributesEx(tempFileName);
                originalInfo.Attributes.Should().NotHaveFlag(FileAttributes.FILE_ATTRIBUTE_READONLY);
                FileMethods.SetFileAttributes(tempFileName, originalInfo.Attributes | FileAttributes.FILE_ATTRIBUTE_READONLY);
                var newInfo = FileMethods.GetFileAttributesEx(tempFileName);
                newInfo.Attributes.Should().HaveFlag(FileAttributes.FILE_ATTRIBUTE_READONLY);
                FileMethods.SetFileAttributes(tempFileName, originalInfo.Attributes);
                newInfo = FileMethods.GetFileAttributesEx(tempFileName);
                newInfo.Attributes.Should().NotHaveFlag(FileAttributes.FILE_ATTRIBUTE_READONLY);
            }
            finally
            {
                FileMethods.DeleteFile(tempFileName);
            }
        }
Exemple #23
0
        public static void foo()
        {
            string path     = Directory.GetCurrentDirectory();
            string fileName = "test-gzip";
            string fileExt  = "txt";

            if (!File.Exists($"{path}\\{fileName}.{fileExt}"))
            {
                FileMethods.WriteFile($"{fileName}.{fileExt}", path);
            }
            FileMethods.Compress($"{fileName}.{fileExt}", fileName + ".gz");

            Console.WriteLine("\n========================\n");

            FileMethods.Decompress($"{path}\\{fileName}.gz", $"{path}\\uncompressed-{fileName}.{fileExt}");
            Console.WriteLine("Нажмите любую кнопку для удаления файла...");
            Console.ReadKey(true);
            FileMethods.DeleteFile(path, $"uncompressed-{fileName}.{fileExt}");
            FileMethods.DeleteFile(path, $"{fileName}.gz");

            Console.WriteLine("========================");
        }