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); } } } }
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 } } }
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); } }
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); } }
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); } }
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); } } }
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(); } }
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); }
public void GetTempFileNameBasic() { string tempPath = FileMethods.GetTempPath(); string tempFileName = FileMethods.GetTempFileName(tempPath, "tfn"); try { tempFileName.Should().StartWith(tempPath); } finally { FileMethods.DeleteFile(tempFileName); } }
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("========================"); }
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(); } }
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); } }
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); } }
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); } }
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(); } } }
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); }
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); } }
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("========================"); }