.Net Framework и С#, весна 2015: Работа с файловой системой и...
Transcript of .Net Framework и С#, весна 2015: Работа с файловой системой и...
План семинара
• Работа с файловой системой• Потоки• Менеджмент ресурсов
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");