2.36M
Категория: ПрограммированиеПрограммирование

Файлы и потоки данных. Работа с файловой системой

1.

Файлы и потоки данных
1

2.

Файлы и потоки данных
РАБОТА С ФАЙЛОВОЙ СИСТЕМОЙ
2

3.

Работа с файловой системой
Для работы с файловой системой в пространстве имен System.IO
определены классы:
FileSystemlnfo. Этот класс является базовым классом, который
позволяет представлять любой объект файловой системы.
Filelnfo и File. Эти классы позволяют представлять файлы в
файловой системе.
Directorylnfо и Directory. Эти классы позволяют представлять
папки в файловой системе.
Path. Этот класс имеет статические члены, которые позволяют
манипулировать путевыми именами.
DriveInfo. Этот класс имеет свойства и методы, которые позволяют
получать информацию о выбранном диске.
3

4.

Работа с файловой системой
Файл — это упорядоченная и именованная
последовательность байтов, имеющая постоянное
хранилище. При работе с файлами используются
пути к каталогам, запоминающие устройства, а также
имена файлов и каталогов.
4

5.

Путь к файлу
Стандартный путь к файлу может состоять из трех
компонентов:
Буква тома или диска, после которой следует разделитель
томов (:).
Имя каталога. Символ разделителя каталогов служит для
разделения подкаталогов во внутренней иерархии
каталога.
Необязательное имя файла. Символ разделителя
каталогов служит для разделения пути к файлу и его
имени.
5

6.

Путь к файлу
Если присутствуют все три компонента, путь является
абсолютным.
Если буква тома или диска не указана и имя каталога
начинается с символа разделителя каталогов, такой путь
задан относительно корня текущего диска.
В противном случае путь задан относительно текущего
каталога.
6

7.

Символ разделителя каталогов
Windows поддерживает либо прямую косую черту
(/), либо обратную косую черту (\) в качестве
символов разделителя пути
Системы на базе UNIX поддерживают только косую
черту (/).
7

8.

Символ разделителя каталогов
При использовании .NET Core для разработки кроссплатформенных приложений:
Вариант 1:
При жестком кодировании символа разделителя каталогов,
следует использовать символ косой черты ( / ). Это
единственный распознаваемый символ-разделитель как в
UNIX, так и в Windows.
8

9.

Символ разделителя каталогов
При использовании .NET Core для разработки кроссплатформенных приложений:
Вариант 2:
Объединение строк для динамического извлечения
символа разделителя пути во время выполнения и его
включения в пути файловой системы.
var separator = Path.DirectorySeparatorChar;
var path = $"{separator}users{separator}user1{separator}";
9

10.

Путь к файлу (UNC - Universal Naming Convention)
UNC-пути (универсальное соглашение об именовании) используются для
доступа к сетевым ресурсам и имеют следующий формат:
Имя сервера или узла, которому предшествуют символы \\. В качестве имени
сервера может выступать имя компьютера NetBIOS, а также IP-адрес или
полное доменное имя (поддерживаются адреса IPv4 и IPv6).
Имя общего ресурса, которое отделяется от имени узла символами \. Имя
сервера и имя общего ресурса в совокупности образуют том.
Имя каталога. Символ разделителя каталогов служит для разделения
подкаталогов во внутренней иерархии каталога.
Необязательное имя файла. Символ разделителя каталогов служит для
разделения пути к файлу и его имени.
10

11.

Класс Path
11

12.

Класс Path
Класс Path выполняет операции с экземплярами
String, которые содержат информацию о пути к файлу
или каталогу.
Эти операции выполняются кроссплатформенным
образом.
12

13.

Класс Path
var path1 = Path.Combine("data", "info.txt");
var fullPath = Path.GetFullPath(path1);
var ext = Path.GetExtension(path1);
var name = Path.GetFileName(path1);
13

14.

DriveInfo
14

15.

DriveInfo
Этот класс имеет статический метод GetDrives, который
возвращает имена всех логических дисков компьютера.
Также он предоставляет ряд полезных свойств
15

16.

DriveInfo
Свойства объекта класса DriveInfo:
• AvailableFreeSpace: объем доступного свободного места на диске в
байтах
• DriveFormat: имя файловой системы
• DriveType: представляет тип диска
• IsReady: готов ли диск
• Name: получает имя диска
• TotalFreeSpace: общий объем свободного места на диске в байтах
• TotalSize: общий размер диска в байтах
• VolumeLabel: получает или устанавливает метку тома
16

17.

DriveInfo
DriveInfo[] allDrives = DriveInfo.GetDrives();
foreach (DriveInfo d in allDrives)
{
Console.WriteLine("Drive {0}", d.Name);
Console.WriteLine(" Drive type: {0}", d.DriveType);
if (d.IsReady == true)
{
Console.WriteLine($" Volume label: {d.VolumeLabel}");
Console.WriteLine($" File system: {d.DriveFormat}");
Console.WriteLine($" Available space to current user:
{d.AvailableFreeSpace,15} bytes");
Console.WriteLine($" Total available space:
{d.TotalFreeSpace,15} bytes");
Console.WriteLine($" Total size of drive:
{d.TotalSize,15}
bytes ");
}
17
}
https://docs.microsoft.com/en-us/dotnet/api/system.io.driveinfo?view=net-5.0

18.

Directory & DirectoryInfo
18

19.

Directory & DirectoryInfo
Классы
Directory и DirectoryInfo пространства имен
System.IO предназначены для работы с каталогами
19

20.

Directory & DirectoryInfo
Класс Directory предоставляет ряд статических методов для управления
каталогами.
CreateDirectory(path): создает каталог по указанному пути path
Delete(path): удаляет каталог по указанному пути path
Exists(path): определяет, существует ли каталог по указанному пути path.
Если существует, возвращается true, если не существует, то false
GetDirectories(path): получает список каталогов в каталоге path
GetFiles(path): получает список файлов в каталоге path
Move(sourceName, destName): перемещает каталог
GetCurrentGirectory(): получение пути к текущему каталогу
20

21.

Directory & DirectoryInfo
Класс DirectoryInfo предоставляет функциональность многом похож
сходную с функциональностью класса Directory. Отличие в том, что это
методы экземпляра класса
Create(): создает каталог
CreateSubdirectory(path): создает подкаталог по указанному пути path
Delete(): удаляет каталог
Свойство Exists: определяет, существует ли каталог
GetDirectories(): получает список каталогов
GetFiles(): получает список файлов
MoveTo(destDirName): перемещает каталог
21

22.

Directory & DirectoryInfo
var dir = new DirectoryInfo("TestFolder");
if(!dir.Exists)
dir.Create();
var files = dir.GetFiles();
22

23.

File & FileInfo
23

24.

File & FileInfo
Классы File и FileInfo пространства имет System.IO
предназначены для работы с файлами. Их функционал
аналогичен классам Directory и DirectoryInfo
24

25.

File & FileInfo
Класс File реализует функциональность с помощью статических
методов:
• Copy(source, destination): копирует файл в новое место
• Create(path): создает файл
• Delete(path): удаляет файл
• Move(source, destination): перемещает файл в новое место
• Exists(path): определяет, существует ли файл
25

26.

File & FileInfo
Некоторые методы и свойства класса FileInfo:
• CopyTo(path): копирует файл в новое место по указанному пути path
• Create(): создает файл
• Delete(): удаляет файл
• MoveTo(destFileName): перемещает файл в новое место
• Свойство Directory: получает родительский каталог в виде объекта DirectoryInfo
• Свойство DirectoryName: получает полный путь к родительскому каталогу
• Свойство Exists: указывает, существует ли файл
• Свойство Length: получает размер файла
• Свойство Extension: получает расширение файла
• Свойство Name: получает имя файла
• Свойство FullName: получает полное имя файла
26

27.

File & FileInfo
FileInfo fi = new FileInfo(@"c:\temp\FileInfo.txt");
Console.WriteLine(fi.Exists); // false
using (TextWriter w = fi.CreateText())
w.Write("Some text");
Console.WriteLine(fi.Exists); // false (по-прежнему)
fi.Refresh();
Console.WriteLine(fi.Exists); // true
Console.WriteLine(fi.Name); // FileInfo.txt
Console.WriteLine(fi.FullName); // c:\temp\FileInfo.txt
Console.WriteLine(fi.DirectoryName); // c:\temp
Console.WriteLine(fi.Directory.Name); // temp
Console.WriteLine(fi.Extension); // .txt
Console.WriteLine(fi.Length); // 9
27

28.

Чтение из файла
string text = File.ReadAllText(path);
string[] text = File.ReadAllLines(path);
byte[] text = File.ReadAllBytes(path);
28

29.

Чтение из файла
Метод
File.ReadAll***(path)
открывает указанный файл, считывает его содержимое и
затем закрывает его.
29

30.

Чтение из файла
Метод
File.ReadAllText(path)
пытается автоматически определять кодировку файла на основе
наличия меток порядка байтов. Могут быть обнаружены форматы
кодирования UTF-8 и UTF-32 (как с прямым порядком, так и с прямым
порядком байтов).
Этот метод гарантирует закрытие дескриптора файла, даже если
возникают исключения.
Чтобы использовать параметры кодировки, настроенные для вашей
операционной системы, укажите свойство Encoding.Default
для параметра encoding.
30

31.

Запись в файл
Для
записи
в
файл
предлагаются
методы,
предназначенные для записи данных в файлы —
WriteAllText (), WriteAllBytes() и WriteAllLines ().
Метод добавляет указанную строку (массив байтов) в файл,
создавая файл, если он еще не существует.
AppendAllText(), AppendAllLines()
(строки) в конец файла

добавляет
31
текст

32.

Файлы и потоки данных
ПОТОКИ ДАННЫХ
32

33.

Потоки данных
Поток (stream) представляет собой объект, который
применяется для передачи данных (не следует путать его с
потоком управления — thread). Данные могут передаваться
в одном из двух направлений:
если данные передаются из какого-то внешнего
источника в программу, это называется чтением данных
из потока;
если данные передаются из программы в какой-то
внешний источник, то это называется записью данных в
поток.
33

34.

Потоки данных
Использование потоков позволяет абстрагировать код
получения/передачи данных от конкретного источника
данных
34

35.

Потоки данных
Абстрактный базовый класс Stream поддерживает чтение и
запись байтов.
Все классы, представляющие потоки, наследуются
от класса Stream .
Класс Stream и его производные классы предоставляют
общее представление об источниках данных и
репозиториях и изолируют программиста от конкретных
деталей операционной системы и базовых устройств.
35

36.

Потоки данных
Потоки включают в себя три основных операции:
Чтение - передача данных из потока в структуру данных,
такую как массив байтов.
Запись - передача данных в поток из источника данных.
Поиск - запрос и изменение текущей позиции в потоке.
36

37.

Потоки данных (реализации класса Stream)
FileStream - для чтения и записи в файл.
MemoryStream - для чтения и записи в память в качестве
резервного хранилища.
BufferedStream - для повышения производительности
операций чтения и записи.
NetworkStream - для чтения и записи через сетевые
сокеты.
PipeStream - для чтения и записи по анонимным и
именованным каналам.
37

38.

Потоки данных
using (var stream = new MemoryStream())
{
byte[] buffer = Encoding.UTF8.GetBytes("Demo
text");
stream.Write(buffer);
stream.Position = 0;
byte[] readData = new byte[stream.Length];
stream.Read(readData);
var text = Encoding.UTF8.GetString(readData);
Console.WriteLine(text);
}
38

39.

var stream = new MemoryStream();
. . .
stream.Close();
39

40.

Потоки данных
using (var stream = new FileStream("temp.txt",
FileMode.OpenOrCreate,
FileAccess.ReadWrite))
{
byte[] buffer = Encoding.UTF8.GetBytes("Demo text");
stream.Write(buffer);
byte[] readData = new byte[stream.Length];
stream.Position = 0;
stream.Read(readData);
var text = Encoding.UTF8.GetString(readData);
Console.WriteLine(text);
}
40

41.

BinaryReader и BinaryWriter
Для чтения и записи двоичных значений встроенных в C#
типов данных можно использовать классы потоков
BinaryReader и BinaryWriter.
Данные считываются и записываются во внутреннем
двоичном формате, а не в удобочитаемой текстовой
форме.
41

42.

BinaryReader и BinaryWriter
using (var stream = File.Create("binDemo.file"))
{
var binWriter = new BinaryWriter(stream);
binWriter.Write(true);
binWriter.Write(12.5);
binWriter.Write("строка");
}
42

43.

BinaryReader и BinaryWriter
using (var stream = File.OpenRead("binDemo.file"))
{
var binReader = new BinaryReader(stream);
bool boolValue = binReader.ReadBoolean();
double doubleValue = binReader.ReadDouble();
string stringValue = binReader.ReadString();
}
43

44.

StreamWriter и StreamReader
Классы StreamWriter и StreamReader используются, когда
нужно читать или записывать символьные данные
(например, строки).
44

45.

StreamWriter и StreamReader
Классы StreamWriter и StreamReader по умолчанию
работают с символами Unicode; однако это можно
изменить
предоставлением
правильно
сконфигурированной
ссылки
на
объект
System.Text.Encoding.
45

46.

StreamWriter и StreamReader
var mStream = new MemoryStream();
var stream1 = new StreamWriter(mStream);
stream1.Write("Demo text");
stream1.Flush();
mStream.Position = 0;
var stream2 = new StreamReader(mStream);
Console.WriteLine(stream2.ReadToEnd());
stream1.Close(); stream2.Close();
46
English     Русский Правила