2._Работа_с_файловой_системой

Содержание

Слайд 2

Основные понятия

Под файлом подразумевается именованная информация на внешнем носителе.
Логически файл можно

Основные понятия Под файлом подразумевается именованная информация на внешнем носителе. Логически файл
представить как конечное количество последовательных байтов.
Передача данных с внешнего устройства в оперативную память называется чтением, или вводом, обратный процесс – записью, или выводом.
Обмен данных реализуется с помощью потоков.
Поток (stream) –это абстрактное понятие, относящееся к любому переносу данных от источника к приемнику. Поток определяется как последовательность байтов и не зависит от конкретного устройства, с которым производится обмен.
Обмен с потоком для повышения скорости передачи производится через специальную область оперативной памяти – буфер.
При записи в файл вся информация сначала направляется в буфер и там накапливается, пока буфер не заполнится. После этого происходит передача данных на внешнее устройство.
При чтении из файла данные вначале считываются в буфер, что позволяет быстро и эффективно обмениваться информацией с внешними устройствами.

Слайд 3

Пространство имен System.IO

Пространство имен System.IO в .NET содержит библиотеки базовых классов, предназначенным

Пространство имен System.IO Пространство имен System.IO в .NET содержит библиотеки базовых классов,
для файлового ввода-вывода, а также ввода-вывода из памяти. 

Слайд 4

Описание классов для работы с файлами

Описание классов для работы с файлами

Слайд 5

Уровни чтения и записи файлов

Обмен с внешними устройствами можно выполнять на уровне:
Двоичного

Уровни чтения и записи файлов Обмен с внешними устройствами можно выполнять на
представления данных (BinaryReader, BinaryWriter).
Байтов (FileStream).
Текста, то есть символов (StreamWriter, StreamReader).

Использование классов файловых потоков предполагает следующие операции.
Создание потока и связывание его с физическим файлом.
Обмен (ввод-вывод).
Закрытие файла.
Потоки для чтения и записи после завершения работы с ними необходимо закрыть с помощью метода Close(), который вызывает метод Dispose() для освобождения всех ресурсов, связанных с файлом.

Слайд 6

FileStream

Для создания байтового потока при использовании файлов используется класс FileStream. Этот класс

FileStream Для создания байтового потока при использовании файлов используется класс FileStream. Этот
считается производным от класса Stream и использует все его функции.
Классы потоков, в том числе класс FileStream, определены в пространстве имен System.IO. Поэтому в начале любой программы, использующей файлы, должен стоять следующий программный код:
using System.IO;
Для формирования байтового потока, связанного с файлом, создается объект класса FileStream. В этом классе определено несколько конструкторов.

Слайд 7

FileStream

Ниже приведена запись для байтового потока данных:
FileStream (string путь, FileMode режим,

FileStream Ниже приведена запись для байтового потока данных: FileStream (string путь, FileMode
FileAccess режим)
где путь адрес и имя открываемого файла, т.е. можно указать полный маршрут к файлу;
а режим – способ открытия файла, он должен соответствовать одному из режимов FileMode, которые приведены далее, на сл. странице.
Эти режимы класса FileStream открывают файл для чтения или записи данных. Отличительным от них способом является режим FileMode.Append, который открывает файл только для дозаписи данных к нему.

Слайд 8

Доступ к файлам

Последовательный – очередной элемент можно прочитать (записать) только после аналогичной

Доступ к файлам Последовательный – очередной элемент можно прочитать (записать) только после
операции с предыдущим элементом.

Произвольный (прямой) – выполняется чтение (запись) произвольного элемента по заданному адресу.

Режимы доступа к файлу в перечислении FileAccess

Режимы открытия файла в перечислении FileMode

Слайд 9

Исключения

static void Main(string[] args)
{ try
{
FileStream f = new FileStream("text1.txt",

Исключения static void Main(string[] args) { try { FileStream f = new
FileMode.Open, FileAccess.ReadWrite);
f.Close();
}
catch (FileNotFoundException e)
{
Console.WriteLine(e.Message);
Console.WriteLine("Проверьте правильность имени файла");
return;
}
catch (Exception e)
{
Console.WriteLine("Error: "+ e.Message);
return;
}
}

Слайд 10

namespace ConsoleApp1
{ class Program
{ static void Main(string[] args)
{
FileStream f

namespace ConsoleApp1 { class Program { static void Main(string[] args) { FileStream
= new FileStream("text.txt", FileMode.Create, FileAccess.ReadWrite);
f.WriteByte(100); // записывает число 100 в начало файла
byte[] x = new byte[10];
for (byte i=0;i<10;++i)
{
x[i] = (byte)(10 - i);
f.WriteByte(i); // записывает 10 чисел о 0 до 9
}
f.Write(x, 0, 5); // записывает первые 5 элементов массива
byte[] y = new byte[20];
f.Seek(0, SeekOrigin.Begin); //установка указателя на начало
f.Read(y, 0, 20); // чтение из файла в массив
foreach (byte elem in y) Console.Write(" " + elem);
Console.WriteLine();
f.Seek(5, SeekOrigin.Begin);//установка указателя на 5-й элемент
int a = f.ReadByte(); // чтение 5-го элемента
Console.WriteLine(a);
a = f.ReadByte(); // чтение 6-го элемента
Console.WriteLine(a);
Console.WriteLine("Текущая позиция в потоке "+f.Position);
f.Close();
} }}

Пример работы с потоком байтов

Слайд 11

Потоки байтов. Класс FileStream

Потоки байтов. Класс FileStream

Слайд 12

Работа с файлами. Классы File и FileInfo

Работа с файлами. Классы File и FileInfo

Слайд 13

string path = @"C:\apache\hta.txt";
FileInfo fileInf = new FileInfo(path);
if (fileInf.Exists)
{
    Console.WriteLine("Имя файла: {0}", fileInf.Name);
    Console.WriteLine("Время

string path = @"C:\apache\hta.txt"; FileInfo fileInf = new FileInfo(path); if (fileInf.Exists) {
создания: {0}", fileInf.CreationTime);
    Console.WriteLine("Размер: {0}", fileInf.Length);
}

Удаление файла

string path = @"C:\apache\hta.txt";
FileInfo fileInf = new FileInfo(path);
if (fileInf.Exists)
{
   fileInf.Delete();
   // альтернатива с помощью класса File
   // File.Delete(path);
}

Получение информации о файле

Слайд 14

Перемещение и копирование файла

string path = @"C:\apache\hta.txt";
string newPath = @"C:\SomeDir\hta.txt";
FileInfo fileInf =

Перемещение и копирование файла string path = @"C:\apache\hta.txt"; string newPath = @"C:\SomeDir\hta.txt";
new FileInfo(path);
if (fileInf.Exists)
{
   fileInf.MoveTo(newPath);      
   // альтернатива с помощью класса File
   // File.Move(path, newPath);
}

Копирование файла

string path = @"C:\apache\hta.txt";
string newPath = @"C:\SomeDir\hta.txt";
FileInfo fileInf = new FileInfo(path);
if (fileInf.Exists)
{
   fileInf.CopyTo(newPath, true);     
   // альтернатива с помощью класса File
   // File.Copy(path, newPath, true);
}

Метод CopyTo класса FileInfo принимает два параметра: путь, по которому файл будет копироваться, и булевое значение, которое указывает, надо ли при копировании перезаписывать файл (если true, как в случае выше, файл при копировании перезаписывается). Если же в качестве последнего параметра передать значение false, то если такой файл уже существует, приложение выдаст ошибку.

Слайд 15

Чтение и запись файлов

Чтение и запись файлов

Слайд 16

Пример чтения и запись в файл

string path = @"c:\app\content.txt";
string originalText = "Hello

Пример чтения и запись в файл string path = @"c:\app\content.txt"; string originalText
Students!";
// запись строки
File.WriteAllText(path, originalText);
// дозапись в конец файла
File.AppendAllText(path, "\nLets work a little bit?\n");
File.AppendAllLines(path, new[] { "Start from the first exercise!", "Deadline is 1 week!" });
// чтение файла
string fileText = File.ReadAllText(path);
Console.WriteLine(fileText);

Слайд 17

Потоки символов. StreamReader и StreamWriter

Потоки символов. StreamReader и StreamWriter

Слайд 18

Пример чтения из файла

string path= @"C:\SomeDir\hta.txt";            
try
{
    Console.WriteLine("***считываем весь файл***");
    using (StreamReader sr = new

Пример чтения из файла string path= @"C:\SomeDir\hta.txt"; try { Console.WriteLine("***считываем весь файл***");
StreamReader(path))
    {
        Console.WriteLine(sr.ReadToEnd());
    }            
}
catch (Exception e)
{
    Console.WriteLine(e.Message);
}

         
Console.WriteLine("******считываем блоками********");
    using (StreamReader sr = new StreamReader(path, System.Text.Encoding.Default))
    {
        char[] array = new char[4];
        // считываем 4 символа
        sr.Read(array, 0, 4);

 
Console.WriteLine("**считываем построчно**");
    using (StreamReader sr = new StreamReader(path, System.Text.Encoding.Default))
    {
        string line;
        while ((line = sr.ReadLine()) != null)
        {
            Console.WriteLine(line);
        }
    }

Слайд 19

Пример записи в текстовый файл

string readPath= @"C:\SomeDir\hta.txt";
string writePath = @"C:\SomeDir\ath.txt";
string text =

Пример записи в текстовый файл string readPath= @"C:\SomeDir\hta.txt"; string writePath = @"C:\SomeDir\ath.txt";
"";
try
{
    using (StreamReader sr = new StreamReader(readPath, System.Text.Encoding.Default))
    {
        text=sr.ReadToEnd();
    }
    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);
    }
}
catch (Exception e)
{
    Console.WriteLine(e.Message);
}

Кодировка, в которой записывается файл.

true - новые данные добавляются в конце к уже имеющимся данным.
false, то файл перезаписывается

Слайд 20

Работа с дисками

Методы:

Свойства:

Работа с дисками Методы: Свойства:

Слайд 21

Пример работы с классом DriveInfo

using System.IO;
using static System.Console;
DriveInfo[] drives =

Пример работы с классом DriveInfo using System.IO; using static System.Console; DriveInfo[] drives
DriveInfo.GetDrives();
foreach (DriveInfo drive in drives)
{
WriteLine($"Название: {drive.Name}");
WriteLine($"Корневой каталог диска: {drive.RootDirectory}");
WriteLine($"Тип: {drive.DriveType}");
WriteLine($"Имя файловой системы: {drive.DriveFormat}");
if (drive.IsReady)
{ WriteLine($"Объем диска: {drive.TotalSize}");
WriteLine($"Свободное пространство: {drive.TotalFreeSpace}");
WriteLine($"Метка диска: {drive.VolumeLabel}");
}}

Слайд 22

Работа с каталогами. Класс Directory и DirectoryInfo

Работа с каталогами. Класс Directory и DirectoryInfo

Слайд 23

Создание каталога

string path = @"C:\SomeDir";
string subpath = @"program\avalon";
DirectoryInfo dirInfo = new DirectoryInfo(path);
if

Создание каталога string path = @"C:\SomeDir"; string subpath = @"program\avalon"; DirectoryInfo dirInfo
(!dirInfo.Exists)
{
    dirInfo.Create();
}
dirInfo.CreateSubdirectory(subpath);

string path = @"C:\SomeDir";
string subpath = @"program\avalon";
if (!Directory.Exists(path))
{
    Directory.CreateDirectory(path);
}
Directory.CreateDirectory($"{path}/{subpath}");

Класс DirectoryInfo

Класс Directory

Слайд 24

Удаление каталога

string dirName = @"C:\SomeDir";
DirectoryInfo dirInfo = new DirectoryInfo(dirName);
if (dirInfo.Exists)
{
    dirInfo.Delete(true);
    Console.WriteLine("Каталог удален");
}
else
{
    Console.WriteLine("Каталог не

Удаление каталога string dirName = @"C:\SomeDir"; DirectoryInfo dirInfo = new DirectoryInfo(dirName); if
существует");
}

string dirName = @"C:\SomeDir";
try
{
    Directory.Delete(dirName, true);
    Console.WriteLine("Каталог удален");
}
catch (Exception ex)
{
    Console.WriteLine(ex.Message);
}

Слайд 25

Перемещение каталога

string string oldPath = @"C:\SomeFolder";
string newPath = @"C:\SomeDir";
DirectoryInfo dirInfo = new

Перемещение каталога string string oldPath = @"C:\SomeFolder"; string newPath = @"C:\SomeDir"; DirectoryInfo
DirectoryInfo(oldPath);
if (dirInfo.Exists && Directory.Exists(newPath) == false)
{
    dirInfo.MoveTo(newPath);
}

Слайд 26

Получение информации о каталоге

using System.IO;
using static System.Console;
string dirName = "C:\\Program Files";
DirectoryInfo dirInfo

Получение информации о каталоге using System.IO; using static System.Console; string dirName =
= new DirectoryInfo(dirName);
WriteLine("Название каталога: {0}", dirInfo.Name);
WriteLine("Полное название каталога: {0}", dirInfo.FullName);
WriteLine("Время создания каталога: {0}", dirInfo.CreationTime);
WriteLine("Время последнего доступа: {0}", dirInfo.LastAccessTime);
WriteLine("Время последнего изменения: {0}", dirInfo.LastWriteTime);
WriteLine("Корневой каталог: {0}", dirInfo.Root);

Слайд 27

Получение списка файлов и подкаталогов

string dirName = "C:\\";
if (Directory.Exists(dirName))
{
    Console.WriteLine("Подкаталоги:");
    string[] dirs = Directory.GetDirectories(dirName);
    foreach

Получение списка файлов и подкаталогов string dirName = "C:\\"; if (Directory.Exists(dirName)) {
(string s in dirs)
    {
        Console.WriteLine(s);
    }
    Console.WriteLine();
    Console.WriteLine("Файлы:");
    string[] files = Directory.GetFiles(dirName);
    foreach (string s in files)
    {
        Console.WriteLine(s);
    }
}

Слайд 28

Фильтрация папок и файлов

string dirName = @"C:\";
// класс Directory
string[] dirs1 = Directory.GetDirectories(dirName,

Фильтрация папок и файлов string dirName = @"C:\"; // класс Directory string[]
"*on");
foreach (string dir in dirs1)
Console.WriteLine(dir);

В качестве фильтра в методы GetDirectories и GetFiles передается шаблон, который может содержать два плейсхолдера: 
* - соответствует любому количеству символов 
?  соответствует одному символу

Слайд 29

Двоичные потоки. BinaryWriter и BinaryReader

Двоичные потоки. BinaryWriter и BinaryReader

Слайд 30

Пример формирования двоичного файла

class Program
{
static void Main(string[] args)
{

Пример формирования двоичного файла class Program { static void Main(string[] args) {
try
{
BinaryWriter f = new BinaryWriter(new FileStream(@"D:\Информационные технологии\states.txt", FileMode.Create));
double d = 0;
while (d<4)
{
f.Write(d);
d +=0.33;
}
f.Seek(16, SeekOrigin.Begin); // второй элемент файла
f.Write(888d);
f.Close();
}
catch (FileNotFoundException e)
{
Console.WriteLine(e.Message);
Console.WriteLine("Проверьте правильность имени файла");
return;
}
catch (Exception e)
{
Console.WriteLine("Error: "+ e.Message);
return;
} } }