.Net Framework и С#, весна 2015: Работа с файловой системой и...

29
Толстиков Никита [email protected] File System and IO 30.03.2022 1 Введение

Transcript of .Net Framework и С#, весна 2015: Работа с файловой системой и...

Толстиков Никита[email protected]

File System and IO

02.05.2023 1Введение

План семинара

• Работа с файловой системой• Потоки• Менеджмент ресурсов

02.05.2023 Толстиков Никита 2План лекции

Drives

02.05.2023 Толстиков Никита 3File System

• Основной класс:DriveInfo

• DriveInfo.GetDrives() – статический метод, возвращает информацию о всех доступных логических дисках в системе

• Так же содержит информацию о имени и типе диска, об общем, занятом и пустом месте на диске, а так же о его готовности и его метке

Drives

02.05.2023 Толстиков Никита 4File System

DriveInfo[] drivesInfo = DriveInfo.GetDrives();foreach (DriveInfo driveInfo in drivesInfo){

Console.WriteLine("Drive {0}", driveInfo.Name);Console.WriteLine(" File type: {0}", driveInfo.DriveType);if (driveInfo.IsReady == true)

{Console.WriteLine(" Volume label: {0}", driveInfo.VolumeLabel);Console.WriteLine(" File system: {0}", driveInfo.DriveFormat); Console.WriteLine(" Available space to user:{0, 15}",

driveInfo.AvailableFreeSpace);Console.WriteLine(" Total available space: {0, 15} bytes",

driveInfo.TotalFreeSpace);Console.WriteLine(" Total size of drive: {0, 15} bytes",

driveInfo.TotalSize); } }

Directories

02.05.2023 Толстиков Никита 5File System

• Основные классы:Directory – статический классDirectoryInfo – объект класса содержит информацию о папке

Directories

02.05.2023 Толстиков Никита 6File System

• Создание директории (по умолчанию текущий пользователь получит все права на новую папку):var directory = Directory.CreateDirectory(@"C:\Temp\

DotNetCourse\Directory"); var directoryInfo = new DirectoryInfo(@"C:\Temp\DotNetCourse\DirectoryInfo");directoryInfo.Create();

Directories

02.05.2023 Толстиков Никита 7File System

• Удаление:

• При отсутствии прав на манипуляции с директориями будет брошено UnauthorizedAccessException

//Проверка наличии директорииif (Directory.Exists(@"C:\Temp\DotNetCourse\Directory")){

Directory.Delete(@"C:\Temp\DotNetCourse\Directory");} var dirInfo = new DirectoryInfo(@"...");if (directoryInfo.Exists){

directoryInfo.Delete();}

Directories

02.05.2023 Толстиков Никита 8File System

• Изменение прав доступа:DirectoryInfo directoryInfo = new DirectoryInfo("TestDirectory");directoryInfo.Create();

DirectorySecurity directorySecurity = directoryInfo.GetAccessControl();directorySecurity.AddAccessRule(new FileSystemAccessRule("everyone",FileSystemRights.ReadAndExecute,AccessControlType.Allow));

directoryInfo.SetAccessControl(directorySecurity);

Directories

02.05.2023 Толстиков Никита 9File System

• Перемещение:Directory.Move(@"C:\source", @"c:\destination");DirectoryInfo directoryInfo = new DirectoryInfo(@"C:\Source");directoryInfo.MoveTo(@"C:\destination");

• Поиск поддиректорий:

• "*a" – searchPattern, по которому фильтруется результат– ‘*’ - ноль или больше символов– ‘?’ – точно

foreach (var dirPath in Directory.GetDirectories(@"C:\Temp", "*a")){

Console.WriteLine(dirPath);}var dirInfo = new DirectoryInfo(@"C:\Temp")foreach(var dirPath in dirInfo.GetDirectories("*a")) {

Console.WriteLine(dirPath);}

Directories

02.05.2023 Толстиков Никита 10File System

• Основные классы:File – статический классFileInfo – объект класса содержит информацию о файле

Files

02.05.2023 Толстиков Никита 11File System

• Удаление файлов:

Files

02.05.2023 Толстиков Никита 12File System

string path = @"c:\temp\test.txt";

if (File.Exists(path)){

File.Delete(path);}

FileInfo fileInfo = new FileInfo(path);if (fileInfo.Exists){

fileInfo.Delete();}

• Перемещение:

• Копирование:

Files

02.05.2023 Толстиков Никита 13File System

string path = @"c:\temp\test.txt";string destPath = @"c:\temp\destTest.txt";File.CreateText(path).Close();File.Move(path, destPath);FileInfo fileInfo = new FileInfo(path);fileInfo.MoveTo(destPath);

string path = @"c:\temp\test.txt";string destPath = @"c:\temp\destTest.txt";File.CreateText(path).Close();File.Copy(path, destPath);FileInfo fileInfo = new FileInfo(path);fileInfo.CopyTo(destPath);

• Пример:

• Класс - Path

Работа с путями

02.05.2023 Толстиков Никита 14File System

string folder = @"C:\temp";string fileName = "test.dat";string fullPath = folder + fileName; // Results in C:\temptest.dat

string folder = @"C:\temp";string fileName = "test.dat";string fullPath = Path.Combine(folder, fileName); // Results in C:\\temp\\test.dat

• Информация о пути:

Работа с путями

02.05.2023 Толстиков Никита 15File System

string path = @"C:\temp\subdir\file.txt";

Console.WriteLine(Path.GetDirectoryName(path)); // Displays C:\temp\subdir

Console.WriteLine(Path.GetExtension(path)); // Displays .txt

Console.WriteLine(Path.GetFileName(path)); // Displays file.txt

Console.WriteLine(Path.GetPathRoot(path)); // Displays C:\

Потоки

02.05.2023 Толстиков Никита 16Потоки

• Базовый абстрактный класс:Stream

• Определяет основные операции, которые переопределяются в классах потомках:– Чтение из потока – это получение

серии байтов, которая транслируется во что-то осмысленное (например, текст, объект и т.д.)

Потоки

02.05.2023 Толстиков Никита 17Потоки

– Запись в поток– это противоположная операция. Объект транслируется в набор байтов, а затем отправляется в поток

– Seeking операция поиска или перемены места курсора. Определена только для потоков у которых есть понятие ткущей позиции.

Например для текстового файла на диске можно задать любую позицию , а для файла который скачивается из сети нельзя «заглянуть вперед», т.е. посмотреть на не полученные еще данные

Виды потоков

02.05.2023 Толстиков Никита 18Потоки

• FileStream – поток для считывания и записи данных из файлов в файловой системе

FileInfo f = new FileInfo("my.txt");FileStream fs = f.OpenRead();var data = new byte[fs.Length];//Считываем набор байтовfs.Read(data, 0, (int)fs.Length);//Интерпретируем набор байтов как текст в кодировке UTF8string text = Encoding.UTF8.GetString(data);Console.WriteLine(text);

Виды потоков

02.05.2023 Толстиков Никита 19Потоки

• MemoryStream – поток для считывания и записи данных в память на хипе

FileInfo f = new FileInfo("my.txt");FileStream fs = f.OpenRead();MemoryStream ms = new MemoryStream();var data = new byte[fs.Length];//Считываем набор байтов из файлаfs.Read(data, 0, (int)fs.Length);//Записываем данные из файла в памятьms.Write(data, 0, data.Length);

Виды потоков

02.05.2023 Толстиков Никита 20Потоки

• GZipStream и DeflateStream – потоки для сжатия информации методом GZip и Deflate соответственно. Находятся в System.IO.Compression

• BufferedStream – используется как буфер для данных и похож на MemoryStream. Во всех потоках из FCL уже есть встроенный буффер. Использование BufferedStream поверх других потоков приведет к двойной буфферизации

Читатели и писатели

02.05.2023 Толстиков Никита 21Потоки

• Для удобной работы с потоками используются классы обертки, которые помогают читать и писать в потоки

• В качестве входных значений принимают ссылку на поток

• StreamReader и StreamWriter – используются для работы с файлами, как текстовыми данными

• BinaryReader и BinaryWriter – используются для работы с файлами, как с бинарными данными

Читатели и писатели

02.05.2023 Толстиков Никита 22Потоки

FileInfo f = new FileInfo("my.txt");FileStream fs = f.OpenRead();

StreamReader reader = new StreamReader(fs);

while (!reader.EndOfStream){

string line = reader.ReadLine();Console.WriteLine(line);

}

Читатели и писатели

02.05.2023 Толстиков Никита 23Потоки

FileInfo f = new FileInfo("my.bin");FileStream fs = f.OpenRead();BinaryReader reader = new BinaryReader(fs);int from = reader.ReadInt32();int to = reader.ReadInt32();char[] ch = reader.ReadChars(to - from);

Resource management

02.05.2023 Толстиков Никита 24Resource management

• При работе с ресурсами (открытые потоки, соединения с БД и т.д.) требуется контролировать их состояние (открыт, закрыт и т.д)

• Garbage collector высвобождает ресурсы в момент их удаления, но делает это в произвольный момент после того как ссылок на объект не осталось. Т.е. делает это неявно

Resource management

02.05.2023 Толстиков Никита 25Resource management

• Чтобы явно освобождать ресурсы С# предлагает идею применения интерфейса IDisposable:

• Большинство классов стандартной библиотеки реализуют этот интерфейс (потоки, читатели, писатели, соединения с БД и т.д.)

public interface IDisposable { void Dispose(); }

Resource management

02.05.2023 Толстиков Никита 26Resource management

• Но ресурс может не освободится, если перед вызовом метода Dispose произойдет исключение

StreamWriter stream = File.CreateText("temp.dat");stream.Write("some data");stream.Dispose();File.Delete("temp.dat");

Resource management

02.05.2023 Толстиков Никита 27Resource management

• Чтобы этого избежать нужно обернуть код в try/finally

try{

StreamWriter stream = File.CreateText("temp.dat");stream.Write("some data");

}finally{

stream.Dispose();}File.Delete("temp.dat");

Resource management

02.05.2023 Толстиков Никита 28Resource management

• Сокращенная форма:

• Конструкция using принимает объект типа IDisposable и вызывает метод Dispose при выходе из нее

using (StreamWriter stream = File.CreateText("temp.dat")){

stream.Write("some data");}File.Delete("temp.dat");

The End

02.05.2023 Толстиков Никита 29Введение