# Конспект лекции "Работа с каталогами и файлами" ## Работа с дисками ``` using System; using System.IO; DriveInfo[] drives = DriveInfo.GetDrives(); foreach (DriveInfo drive in drives) { Console.WriteLine($"Название: {drive.Name}"); Console.WriteLine($"Тип: {drive.DriveType}"); if (drive.IsReady) { Console.WriteLine($"Объем диска: {drive.TotalSize}"); Console.WriteLine($"Свободное пространство: {drive.TotalFreeSpace}"); Console.WriteLine($"Метка: {drive.VolumeLabel}"); } Console.WriteLine(); } ``` Результат работы: ``` Название: C:\ Тип: Fixed Объем диска: 127326396416 Свободное пространство: 81790328832 Метка: Название: D:\ Тип: Fixed Объем диска: 249375666176 Свободное пространство: 84100747264 Метка: Process finished with exit code 0. ``` ## Работа с каталогами ### Получение списка файлов и подкаталогов ``` string dirName = "C:\\"; if (Directory.Exists(dirName)) { Console.WriteLine("Подкаталоги:"); string[] dirs = Directory.GetDirectories(dirName); foreach (string s in dirs) { Console.WriteLine(s); } Console.WriteLine(); Console.WriteLine("Файлы:"); string[] files = Directory.GetFiles(dirName); foreach (string s in files) { Console.WriteLine(s); } } ``` Результат работы: ``` Подкаталоги: C:\$Recycle.Bin C:\$WinREAgent C:\Config.Msi C:\Documents and Settings C:\Intel C:\PerfLogs C:\Program Files C:\Program Files (x86) C:\ProgramData C:\Recovery C:\System Volume Information C:\Users C:\Windows Файлы: C:\DumpStack.log.tmp C:\hiberfil.sys C:\pagefile.sys C:\swapfile.sys Process finished with exit code 0. ``` ### Создание каталога ``` string path = @"C:\Users\mister pig\Documents"; string subpath = @"program\avalon"; DirectoryInfo dirInfo = new DirectoryInfo(path); if (!dirInfo.Exists) { dirInfo.Create(); } dirInfo.CreateSubdirectory(subpath); ``` Результат работы: ``` Process finished with exit code 0. ``` ### Получение информации о каталоге ``` string dirName = "C:\\Program Files"; DirectoryInfo dirInfo = new DirectoryInfo(dirName); Console.WriteLine($"Название каталога: {dirInfo.Name}"); Console.WriteLine($"Полное название каталога: {dirInfo.FullName}"); Console.WriteLine($"Время создания каталога: {dirInfo.CreationTime}"); Console.WriteLine($"Корневой каталог: {dirInfo.Root}"); ``` Результат работы: ``` Название каталога: Program Files Полное название каталога: C:\Program Files Время создания каталога: 07.12.2019 12:14:52 Корневой каталог: C:\ Process finished with exit code 0. ``` ### Удаление каталога ``` string dirName = @"C:\Users\mister pig\Documents\panda"; try { DirectoryInfo dirInfo = new DirectoryInfo(dirName); dirInfo.Delete(true); Console.WriteLine("Каталог удален"); } catch (Exception ex) { Console.WriteLine(ex.Message); } ``` Результат работы: ``` Каталог удален Process finished with exit code 0. ``` ### Перемещение каталога ``` string oldPath = @"C:\Users\mister pig\Documents\program"; string newPath = @"C:\Users\mister pig\Documents\panda"; DirectoryInfo dirInfo = new DirectoryInfo(oldPath); if (dirInfo.Exists && Directory.Exists(newPath) == false) { dirInfo.MoveTo(newPath); } ``` Результат работы: ``` Process finished with exit code 0. ``` ## Работа с файлами. Классы File и FileInfo ### Получение информации о файле ``` string path = @"C:\Users\mister pig\Documents\panda\panda.txt"; FileInfo fileInf = new FileInfo(path); if (fileInf.Exists) { Console.WriteLine("Имя файла: {0}", fileInf.Name); Console.WriteLine("Время создания: {0}", fileInf.CreationTime); Console.WriteLine("Размер: {0}", fileInf.Length); } ``` Результат работы: ``` Имя файла: panda.txt Время создания: 08.03.2024 20:04:20 Размер: 47 Process finished with exit code 0. ``` ### Удаление файла ``` string path = @"C:\Users\mister pig\Documents\panda\bamboo.txt"; FileInfo fileInf = new FileInfo(path); if (fileInf.Exists) { fileInf.Delete(); // альтернатива с помощью класса File // File.Delete(path); } ``` Результат работы: ``` Process finished with exit code 0. ``` ### Перемещение файла ``` string path = @"C:\Users\mister pig\Documents\panda\panda.txt"; string newPath = @"C:\Users\mister pig\Documents\pororo.txt"; FileInfo fileInf = new FileInfo(path); if (fileInf.Exists) { fileInf.MoveTo(newPath); // альтернатива с помощью класса File // File.Move(path, newPath); } ``` Результат работы: ``` Process finished with exit code 0. ``` ### Копирование файла ``` string path = @"C:\Users\mister pig\Documents\panda\bamboo.txt"; string newPath = @"C:\Users\mister pig\Documents\panda\totoro.txt"; FileInfo fileInf = new FileInfo(path); if (fileInf.Exists) { fileInf.CopyTo(newPath, true); // альтернатива с помощью класса File // File.Copy(path, newPath, true); } ``` Результат работы: ``` Process finished with exit code 0. ``` ## FileStream. Чтение и запись файла ### Посмотрим на примере считывания-записи в текстовый файл: ``` using System; using System.IO; namespace HelloApp { class Program { static void Main(string[] args) { // создаем каталог для файла string path = @"C:\Users\mister pig\Documents\panda"; DirectoryInfo dirInfo = new DirectoryInfo(path); if (!dirInfo.Exists) { dirInfo.Create(); } Console.WriteLine("Введите строку для записи в файл:"); string text = Console.ReadLine(); // запись в файл using (FileStream fstream = new FileStream($"{path}\note.txt", FileMode.OpenOrCreate)) { // преобразуем строку в байты byte[] array = System.Text.Encoding.Default.GetBytes(text); // запись массива байтов в файл fstream.Write(array, 0, array.Length); Console.WriteLine("Текст записан в файл"); } // чтение из файла using (FileStream fstream = File.OpenRead($"{path}\note.txt")) { // преобразуем строку в байты byte[] array = new byte[fstream.Length]; // считываем данные fstream.Read(array, 0, array.Length); // декодируем байты в строку string textFromFile = System.Text.Encoding.Default.GetString(array); Console.WriteLine($"Текст из файла: {textFromFile}"); } Console.ReadLine(); } } } ``` Результат работы: ``` Введите строку для записи в файл: panda Unhandled exception. System.IO.IOException: Синтаксическая ошибка в имени файла, имени папки или метке тома. : 'C:\Users\mister pig\Documents\panda ote.txt' at Microsoft.Win32.SafeHandles.SafeFileHandle.CreateFile(String fullPath, FileMode mode, FileAccess access, FileShare share, FileOptions options) at Microsoft.Win32.SafeHandles.SafeFileHandle.Open(String fullPath, FileMode mode, FileAccess access, FileShare share, FileOptions options, Int64 preal locationSize) at System.IO.Strategies.OSFileStreamStrategy..ctor(String path, FileMode mode, FileAccess access, FileShare share, FileOptions options, Int64 prealloca tionSize) at System.IO.Strategies.FileStreamHelpers.ChooseStrategyCore(String path, FileMode mode, FileAccess access, FileShare share, FileOptions options, Int64 preallocationSize) at System.IO.Strategies.FileStreamHelpers.ChooseStrategy(FileStream fileStream, String path, FileMode mode, FileAccess access, FileShare share, Int32 b ufferSize, FileOptions options, Int64 preallocationSize) at System.IO.FileStream..ctor(String path, FileMode mode) at HelloApp.Program.Main(String[] args) in C:\Users\mister pig\RiderProjects\bamboo\bamboo\Program.cs:line 21 Process finished with exit code -532,462,766. ``` ## изменим выше приведенную программу, применив асинхронные методы: ``` using System; using System.IO; using System.Threading.Tasks; namespace HelloApp { class Program { static async Task Main(string[] args) { // создаем каталог для файла string path = @"C:\Users\mister pig\Documents\panda"; DirectoryInfo dirInfo = new DirectoryInfo(path); if (!dirInfo.Exists) { dirInfo.Create(); } Console.WriteLine("Введите строку для записи в файл:"); string text = Console.ReadLine(); // запись в файл using (FileStream fstream = new FileStream($"{path}\note.txt", FileMode.OpenOrCreate)) { byte[] array = System.Text.Encoding.Default.GetBytes(text); // асинхронная запись массива байтов в файл await fstream.WriteAsync(array, 0, array.Length); Console.WriteLine("Текст записан в файл"); } // чтение из файла using (FileStream fstream = File.OpenRead($"{path}\note.txt")) { byte[] array = new byte[fstream.Length]; // асинхронное чтение файла await fstream.ReadAsync(array, 0, array.Length); string textFromFile = System.Text.Encoding.Default.GetString(array); Console.WriteLine($"Текст из файла: {textFromFile}"); } Console.ReadLine(); } } } ``` Результат работы: ``` Введите строку для записи в файл: panda Unhandled exception. System.IO.IOException: Синтаксическая ошибка в имени файла, имени папки или метке тома. : 'C:\Users\mister pig\Documents\panda ote.txt' at Microsoft.Win32.SafeHandles.SafeFileHandle.CreateFile(String fullPath, FileMode mode, FileAccess access, FileShare share, FileOptions options) at Microsoft.Win32.SafeHandles.SafeFileHandle.Open(String fullPath, FileMode mode, FileAccess access, FileShare share, FileOptions options, Int64 preal locationSize) at System.IO.Strategies.OSFileStreamStrategy..ctor(String path, FileMode mode, FileAccess access, FileShare share, FileOptions options, Int64 prealloca tionSize) at System.IO.Strategies.FileStreamHelpers.ChooseStrategyCore(String path, FileMode mode, FileAccess access, FileShare share, FileOptions options, Int64 preallocationSize) at System.IO.Strategies.FileStreamHelpers.ChooseStrategy(FileStream fileStream, String path, FileMode mode, FileAccess access, FileShare share, Int32 b ufferSize, FileOptions options, Int64 preallocationSize) at System.IO.FileStream..ctor(String path, FileMode mode) at HelloApp.Program.Main(String[] args) in C:\Users\mister pig\RiderProjects\bamboo\bamboo\Program.cs:line 22 at HelloApp.Program.
(String[] args) Process finished with exit code -532,462,766. ``` ### Произвольный доступ к файлам ``` using System.IO; using System.Text; class Program { static void Main(string[] args) { string text = "hello world"; // запись в файл using (FileStream fstream = new FileStream(@"C:\Users\mister pig\Documents\panda\panda.txt", FileMode.OpenOrCreate)) { // преобразуем строку в байты byte[] input = Encoding.Default.GetBytes(text); // запись массива байтов в файл fstream.Write(input, 0, input.Length); Console.WriteLine("Текст записан в файл"); // перемещаем указатель в конец файла, до конца файла- пять байт fstream.Seek(-5, SeekOrigin.End); // минус 5 символов с конца потока // считываем четыре символов с текущей позиции byte[] output = new byte[4]; fstream.Read(output, 0, output.Length); // декодируем байты в строку string textFromFile = Encoding.Default.GetString(output); Console.WriteLine($"Текст из файла: {textFromFile}"); // worl // заменим в файле слово world на слово house string replaceText = "house"; fstream.Seek(-5, SeekOrigin.End); // минус 5 символов с конца потока input = Encoding.Default.GetBytes(replaceText); fstream.Write(input, 0, input.Length); // считываем весь файл // возвращаем указатель в начало файла fstream.Seek(0, SeekOrigin.Begin); output = new byte[fstream.Length]; fstream.Read(output, 0, output.Length); // декодируем байты в строку textFromFile = Encoding.Default.GetString(output); Console.WriteLine($"Текст из файла: {textFromFile}"); // hello house } Console.Read(); } } ``` Результат работы: ``` Текст записан в файл Текст из файла: worl Текст из файла: hello house Process finished with exit code 0. ``` ### Закрытие потока ``` FileStream fstream = null; try { fstream = new FileStream(@"C:\Users\mister pig\Documents\panda\baobab.txt", FileMode.OpenOrCreate); // операции с потоком } catch(Exception ex) { } finally { if (fstream != null) fstream.Close(); } ``` Результат работы: ``` Process finished with exit code 0. ``` ## Чтение и запись текстовых файлов. StreamReader и StreamWriter ### запись в файл ``` using System; using System.IO; namespace HelloApp { class Program { static void Main(string[] args) { string writePath = @"C:\Users\mister pig\Documents\panda\totoro.txt"; string text = "Привет мир!\nПока мир..."; try { using (StreamWriter sw = new StreamWriter( writePath, false, System.Text.Encoding.Default)) { sw.WriteLine(text); } using (StreamWriter sw = new StreamWriter( writePath, true, System.Text.Encoding.Default)) { sw.WriteLine("Дозапись"); sw.Write(4.5); } Console.WriteLine("Запись выполнена"); } catch (Exception e) { Console.WriteLine(e.Message); } } } } ``` Результат работы: ``` Запись выполнена Process finished with exit code 0. ``` ### асинхронные версии методов: ``` using System; using System.IO; using System.Threading.Tasks; namespace HelloApp { class Program { static async Task Main(string[] args) { string writePath = @"C:\Users\mister pig\Documents\panda\totoro.txt"; string text = "Привет мир!\nПока мир..."; try { using (StreamWriter sw = new StreamWriter( writePath, false, System.Text.Encoding.Default)) { await sw.WriteLineAsync(text); } using (StreamWriter sw = new StreamWriter( writePath, true, System.Text.Encoding.Default)) { await sw.WriteLineAsync("Дозапись"); await sw.WriteAsync("4,5"); } Console.WriteLine("Запись выполнена"); } catch (Exception e) { Console.WriteLine(e.Message); } } } } ``` Результат работы: ``` Запись выполнена Process finished with exit code 0. ``` ### Сначала считаем текст полностью из ранее записанного файла: ``` using System; using System.IO; using System.Threading.Tasks; string path = @"C:\Users\mister pig\Documents\panda\bamboo.txt"; try { using (StreamReader sr = new StreamReader(path)) { Console.WriteLine(sr.ReadToEnd()); } // асинхронное чтение using (StreamReader sr = new StreamReader(path)) { Console.WriteLine(await sr.ReadToEndAsync()); } } catch (Exception e) { Console.WriteLine(e.Message); } ``` Результат работы: ``` aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa Process finished with exit code 0. ``` ### Считаем текст из файла построчно: ``` string path= @"C:\Users\mister pig\Documents\panda\bamboo.txt"; using (StreamReader sr = new StreamReader(path, System.Text.Encoding.Default)) { string line; while ((line = sr.ReadLine()) != null) { Console.WriteLine(line); } } // асинхронное чтение using (StreamReader sr = new StreamReader(path, System.Text.Encoding.Default)) { string line; while ((line = await sr.ReadLineAsync()) != null) { Console.WriteLine(line); } } ``` Результат работы: ``` aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa Process finished with exit code 0. ``` ## Бинарные файлы. BinaryWriter и BinaryReader ``` struct State { public string name; public string capital; public int area; public double people; public State(string n, string c, int a, double p) { name = n; capital = c; people = p; area = a; } } class Program { static void Main(string[] args) { State[] states = new State[2]; states[0] = new State("Германия", "Берлин", 357168, 80.8); states[1] = new State("Франция", "Париж", 640679, 64.7); string path= @"C:\Users\mister pig\Documents\panda\baobab.txt"; try { // создаем объект BinaryWriter using (BinaryWriter writer = new BinaryWriter(File.Open(path, FileMode.OpenOrCreate))) { // записываем в файл значение каждого поля структуры foreach (State s in states) { writer.Write(s.name); writer.Write(s.capital); writer.Write(s.area); writer.Write(s.people); } } // создаем объект BinaryReader using (BinaryReader reader = new BinaryReader(File.Open(path, FileMode.Open))) { // пока не достигнут конец файла // считываем каждое значение из файла while (reader.PeekChar() > -1) { string name = reader.ReadString(); string capital = reader.ReadString(); int area = reader.ReadInt32(); double population = reader.ReadDouble(); Console.WriteLine("Страна: {0} столица: {1} площадь {2} кв. км численность населения: {3} млн. чел.", name, capital, area, population); } } } catch (Exception e) { Console.WriteLine(e.Message); } Console.ReadLine(); } } ``` Результат работы: ``` Страна: Германия столица: Берлин площадь 357168 кв. км численность населения: 80,8 млн. чел. Страна: Франция столица: Париж площадь 640679 кв. км численность населения: 64,7 млн. чел. Unable to read beyond the end of the stream. Process finished with exit code 0. ``` ## Бинарная сериализация. BinaryFormatter ``` using System; using System.IO; using System.Runtime.Serialization.Formatters.Binary; namespace Serialization { [Serializable] class Person { public string Name { get; set; } public int Age { get; set; } public Person(string name, int age) { Name = name; Age = age; } } class Program { static void Main(string[] args) { // объект для сериализации Person person = new Person("Tom", 29); Console.WriteLine("Объект создан"); // создаем объект BinaryFormatter BinaryFormatter formatter = new BinaryFormatter(); // получаем поток, куда будем записывать сериализованный объект using (FileStream fs = new FileStream("people.dat", FileMode.OpenOrCreate)) { formatter.Serialize(fs, person); Console.WriteLine("Объект сериализован"); } // десериализация из файла people.dat using (FileStream fs = new FileStream("people.dat", FileMode.OpenOrCreate)) { Person newPerson = (Person)formatter.Deserialize(fs); Console.WriteLine("Объект десериализован"); Console.WriteLine($"Имя: {newPerson.Name} --- Возраст: {newPerson.Age}"); } Console.ReadLine(); } } } ``` Результат работы: ``` Объект создан Объект сериализован Объект десериализован Имя: Tom --- Возраст: 29 ```