|
@@ -1,729 +1,144 @@
|
|
-# Конспект лекции "Работа с каталогами и файлами"
|
|
|
|
-## Работа с дисками
|
|
|
|
|
|
+# Конспект лекции "Форматы файлов"
|
|
|
|
+## CSV
|
|
```
|
|
```
|
|
-using System;
|
|
|
|
-using System.IO;
|
|
|
|
-
|
|
|
|
-DriveInfo[] drives = DriveInfo.GetDrives();
|
|
|
|
|
|
+using System.Globalization;
|
|
|
|
+using CsvHelper;
|
|
|
|
+using CsvHelper.Configuration;
|
|
|
|
|
|
-foreach (DriveInfo drive in drives)
|
|
|
|
-{
|
|
|
|
- Console.WriteLine($"Название: {drive.Name}");
|
|
|
|
- Console.WriteLine($"Тип: {drive.DriveType}");
|
|
|
|
- if (drive.IsReady)
|
|
|
|
|
|
+using (var reader = new StreamReader("./people.dat")) {
|
|
|
|
+ using (var csv = new CsvReader(
|
|
|
|
+ reader, CultureInfo.InvariantCulture))
|
|
{
|
|
{
|
|
- 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);
|
|
|
|
|
|
+ var records = csv.GetRecords<Foo>();
|
|
|
|
+ foreach (var record in records) {
|
|
|
|
+ Console.WriteLine("{0}, {1}", record.description, record.value);
|
|
|
|
+ }
|
|
}
|
|
}
|
|
}
|
|
}
|
|
-```
|
|
|
|
-Результат работы:
|
|
|
|
-```
|
|
|
|
-Подкаталоги:
|
|
|
|
-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)
|
|
|
|
|
|
+public class Foo
|
|
{
|
|
{
|
|
- dirInfo.Create();
|
|
|
|
|
|
+ public string description { get; set; }
|
|
|
|
+ public double value { get; set; }
|
|
}
|
|
}
|
|
-dirInfo.CreateSubdirectory(subpath);
|
|
|
|
```
|
|
```
|
|
-Результат работы:
|
|
|
|
```
|
|
```
|
|
-Process finished with exit code 0.
|
|
|
|
|
|
+строка с пробелами, 123,15
|
|
|
|
+строка
|
|
|
|
+с переносом
|
|
|
|
+строки, 456
|
|
```
|
|
```
|
|
-### Получение информации о каталоге
|
|
|
|
|
|
+### Запись в CSV
|
|
```
|
|
```
|
|
-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:\
|
|
|
|
|
|
+// использую не стандартный формат
|
|
|
|
+var config = new CsvConfiguration(
|
|
|
|
+ CultureInfo.InvariantCulture) {
|
|
|
|
+ Delimiter = ";",
|
|
|
|
+ HasHeaderRecord = false };
|
|
|
|
|
|
-Process finished with exit code 0.
|
|
|
|
-```
|
|
|
|
-### Удаление каталога
|
|
|
|
-```
|
|
|
|
-string dirName = @"C:\Users\mister pig\Documents\panda";
|
|
|
|
-
|
|
|
|
-try
|
|
|
|
|
|
+// создаю тестовые данные
|
|
|
|
+var records = new List<Foo>
|
|
{
|
|
{
|
|
- DirectoryInfo dirInfo = new DirectoryInfo(dirName);
|
|
|
|
- dirInfo.Delete(true);
|
|
|
|
- Console.WriteLine("Каталог удален");
|
|
|
|
-}
|
|
|
|
-catch (Exception ex)
|
|
|
|
-{
|
|
|
|
- Console.WriteLine(ex.Message);
|
|
|
|
-}
|
|
|
|
-```
|
|
|
|
-Результат работы:
|
|
|
|
-```
|
|
|
|
-Каталог удален
|
|
|
|
|
|
+ new Foo {
|
|
|
|
+ description ="тест записи\nмногострочного текста",
|
|
|
|
+ value = 12.34 },
|
|
|
|
+ new Foo {
|
|
|
|
+ description = "просто, текст, с запятыми",
|
|
|
|
+ value = 0 }
|
|
|
|
+};
|
|
|
|
|
|
-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)
|
|
|
|
|
|
+using (var writer = new StreamWriter("./test3.csv"))
|
|
|
|
+using (var csv = new CsvWriter(writer, config))
|
|
{
|
|
{
|
|
- dirInfo.MoveTo(newPath);
|
|
|
|
|
|
+ csv.WriteRecords(records);
|
|
}
|
|
}
|
|
```
|
|
```
|
|
-Результат работы:
|
|
|
|
```
|
|
```
|
|
-Process finished with exit code 0.
|
|
|
|
|
|
+"тест записи
|
|
|
|
+многострочного текста";12.34
|
|
|
|
+просто, текст, с запятыми;0
|
|
```
|
|
```
|
|
-## Работа с файлами. Классы File и FileInfo
|
|
|
|
-### Получение информации о файле
|
|
|
|
|
|
+## JSON
|
|
|
|
+### Пример сериализации
|
|
```
|
|
```
|
|
-string path = @"C:\Users\mister pig\Documents\panda\panda.txt";
|
|
|
|
-FileInfo fileInf = new FileInfo(path);
|
|
|
|
-if (fileInf.Exists)
|
|
|
|
|
|
+var person = new Person
|
|
{
|
|
{
|
|
- Console.WriteLine("Имя файла: {0}", fileInf.Name);
|
|
|
|
- Console.WriteLine("Время создания: {0}", fileInf.CreationTime);
|
|
|
|
- Console.WriteLine("Размер: {0}", fileInf.Length);
|
|
|
|
-}
|
|
|
|
-```
|
|
|
|
-Результат работы:
|
|
|
|
-```
|
|
|
|
-Имя файла: panda.txt
|
|
|
|
-Время создания: 08.03.2024 20:04:20
|
|
|
|
-Размер: 47
|
|
|
|
|
|
+ name = "Имя",
|
|
|
|
+ age = 18,
|
|
|
|
+ date = "2024-03-07"
|
|
|
|
+};
|
|
|
|
|
|
-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
|
|
|
|
|
|
+string json = JsonConvert.SerializeObject(
|
|
|
|
+ person, Formatting.Indented);
|
|
|
|
|
|
-Process finished with exit code -532,462,766.
|
|
|
|
|
|
+Console.WriteLine(json);
|
|
```
|
|
```
|
|
-## изменим выше приведенную программу, применив асинхронные методы:
|
|
|
|
```
|
|
```
|
|
-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();
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
|
|
+ "name": "Имя",
|
|
|
|
+ "age":18,
|
|
|
|
+ "date":"2024-03-07"
|
|
}
|
|
}
|
|
```
|
|
```
|
|
-Результат работы:
|
|
|
|
|
|
+### Сериализация (Преобразование объекта в JSON-строку)
|
|
```
|
|
```
|
|
-Введите строку для записи в файл:
|
|
|
|
-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.<Main>(String[] args)
|
|
|
|
|
|
+var PersonList = new List<Person>() {
|
|
|
|
+ new Person {name="Иванов", age=25, date=new DateTime(2021,1,1)},
|
|
|
|
+ new Person {name="Петров", age=35, date=new DateTime(2021,1,2)}
|
|
|
|
+};
|
|
|
|
|
|
-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
|
|
|
|
|
|
+// создаем объект сериализатора, указав, что на входе
|
|
|
|
+// будет МАССИВ объектов Person
|
|
|
|
+var Serializer = new DataContractJsonSerializer(typeof(Person[]));
|
|
|
|
|
|
-Process finished with exit code 0.
|
|
|
|
-```
|
|
|
|
-### Закрытие потока
|
|
|
|
-```
|
|
|
|
-FileStream fstream = null;
|
|
|
|
-try
|
|
|
|
|
|
+using (var streamWriter = new StreamWriter("test1.json"))
|
|
{
|
|
{
|
|
- fstream = new FileStream(@"C:\Users\mister pig\Documents\panda\baobab.txt", FileMode.OpenOrCreate);
|
|
|
|
- // операции с потоком
|
|
|
|
-}
|
|
|
|
-catch(Exception ex)
|
|
|
|
-{
|
|
|
|
-
|
|
|
|
-}
|
|
|
|
-finally
|
|
|
|
-{
|
|
|
|
- if (fstream != null)
|
|
|
|
- fstream.Close();
|
|
|
|
|
|
+ Serializer.WriteObject(
|
|
|
|
+ streamWriter.BaseStream,
|
|
|
|
+ // Преобразуем список (List) объектов в МАССИВ
|
|
|
|
+ PersonList.ToArray()
|
|
|
|
+ );
|
|
}
|
|
}
|
|
```
|
|
```
|
|
-Результат работы:
|
|
|
|
```
|
|
```
|
|
-Process finished with exit code 0.
|
|
|
|
|
|
+[{"age":25,"date":"\/Date(1609448400000+0300)\/","name":"Иванов"},{"age":35,"date":"\/Date(1609534800000+0300)\/","name":"Петров"}]
|
|
```
|
|
```
|
|
-## Чтение и запись текстовых файлов. StreamReader и StreamWriter
|
|
|
|
-### запись в файл
|
|
|
|
|
|
+### Десериализация
|
|
```
|
|
```
|
|
-using System;
|
|
|
|
-using System.IO;
|
|
|
|
-
|
|
|
|
-namespace HelloApp
|
|
|
|
|
|
+[DataContract]
|
|
|
|
+internal class Person
|
|
{
|
|
{
|
|
- 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);
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
-}
|
|
|
|
-```
|
|
|
|
-Результат работы:
|
|
|
|
-```
|
|
|
|
-Запись выполнена
|
|
|
|
|
|
+ // создаем приватную переменную для хранения даты
|
|
|
|
+ private DateTime privateDate;
|
|
|
|
|
|
-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);
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
-}
|
|
|
|
-```
|
|
|
|
-Результат работы:
|
|
|
|
-```
|
|
|
|
-Запись выполнена
|
|
|
|
|
|
+ [DataMember]
|
|
|
|
+ public string name { get; set; }
|
|
|
|
|
|
-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
|
|
|
|
|
|
+ [DataMember]
|
|
|
|
+ public string age { get; set; }
|
|
|
|
|
|
-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);
|
|
|
|
|
|
+ // создаем ПРИВАТНОЕ СТРОКОВОЕ свойство и с помощью атрибутов меняем ему имя для сериализатора
|
|
|
|
+ [DataMember(Name = "date")]
|
|
|
|
+ private string StringDate {
|
|
|
|
+ get {
|
|
|
|
+ return privateDate.ToString("yyyy-MM-dd");
|
|
}
|
|
}
|
|
- Console.ReadLine();
|
|
|
|
|
|
+ set {
|
|
|
|
+ // 2021-03-21
|
|
|
|
+ // 0123456789
|
|
|
|
+ privateDate = new DateTime(
|
|
|
|
+ Convert.ToInt32(value.Substring(0, 4)),
|
|
|
|
+ Convert.ToInt32(value.Substring(5, 2)),
|
|
|
|
+ Convert.ToInt32(value.Substring(8, 2))
|
|
|
|
+ );
|
|
|
|
+ }
|
|
}
|
|
}
|
|
-}
|
|
|
|
-```
|
|
|
|
-Результат работы:
|
|
|
|
-```
|
|
|
|
-Страна: Германия столица: Берлин площадь 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();
|
|
|
|
- }
|
|
|
|
|
|
+ // публичное свойство "дата" скрываем от сериализатора
|
|
|
|
+ [IgnoreDataMember]
|
|
|
|
+ public DateTime date {
|
|
|
|
+ get { return privateDate; }
|
|
|
|
+ set { privateDate = value; }
|
|
}
|
|
}
|
|
}
|
|
}
|
|
```
|
|
```
|
|
-Результат работы:
|
|
|
|
-```
|
|
|
|
-Объект создан
|
|
|
|
-Объект сериализован
|
|
|
|
-Объект десериализован
|
|
|
|
-Имя: Tom --- Возраст: 29
|
|
|
|
-```
|
|
|
|
-
|
|
|
|
-
|
|
|
|
-
|
|
|
|
-
|
|
|
|
-
|
|
|
|
-
|
|
|
|
-
|
|
|