СДЕЛАЙТЕ СВОИ УРОКИ ЕЩЁ ЭФФЕКТИВНЕЕ, А ЖИЗНЬ СВОБОДНЕЕ

Благодаря готовым учебным материалам для работы в классе и дистанционно

Скидки до 50 % на комплекты
только до

Готовые ключевые этапы урока всегда будут у вас под рукой

Организационный момент

Проверка знаний

Объяснение материала

Закрепление изученного

Итоги урока

Разработка кода ИС Практическая работа №14

Категория: Информатика

Нажмите, чтобы узнать подробности

Просмотр содержимого документа
«Разработка кода ИС Практическая работа №14»

Практическая работа №14

Тема: Основы работы с файлами. Работа с файлами

Цель работы: изучить основные операции с файлами в программировании, понять, как создавать, открывать, читать, записывать и закрывать файлы.

Краткие теоретические сведения

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

комплексных задачах, как например, создание текстового редактора и других подобных задачах.

Фреймворк .NET предоставляет большие возможности по управлению и манипуляции файлами и каталогами, которые по большей части сосредоточены в пространстве имен System.IO. Классы, расположенные в этом пространстве имен (такие как Stream, StreamWriter, FileStream и др.), позволяют управлять файловым вводом-выводом.

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

Работу с файловой системой начнем с самого верхнего уровня - дисков. Для представления диска в пространстве имен System.IO имеется класс DriveInfo.

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

  • AvailableFreeSpace: указывает на объем доступного свободного места на диске в байтах

  • DriveFormat: получает имя файловой системы

  • DriveType: представляет тип диска

  • IsReady: готов ли диск (например, DVD-диск может быть не вставлен в дисковод)

  • Name: получает имя диска

  • RootDirectory: возвращает корневой каталог диска

  • TotalFreeSpace: получает общий объем свободного места на диске в байтах

  • TotalSize: общий размер диска в байтах

  • VolumeLabel: получает или устанавливает метку тома


Пример: Получение имени и свойств всех дисков на компьютере:

DriveInfo[] drives = DriveInfo.GetDrives();



foreach (DriveInfo drive in drives)

{

Console.WriteLine($"Название: {drive.Name}");

Console.WriteLine($"Тип: {drive.DriveType}");

if (drive.IsReady)

{

Console.WriteLine($"Объем диска: {drive.TotalSize}");

Console.WriteLine($"Свободное пространство: {drive.TotalFreeSpace}");

Console.WriteLine($"Метка диска: {drive.VolumeLabel}");

}

Console.WriteLine();

}

Консольный вывод в моем случае:


Работа с каталогами

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

Класс Directory

Статический класс Directory предоставляет ряд методов для управления каталогами. Некоторые из этих методов:

  • CreateDirectory(path): создает каталог по указанному пути path

  • Delete(path): удаляет каталог по указанному пути path

  • Exists(path): определяет, существует ли каталог по указанному пути path. Если существует, возвращается true, если не существует, то false

  • GetCurrentDirectory(): получает путь к текущей папке

  • GetDirectories(path): получает список подкаталогов в каталоге path

  • GetFiles(path): получает список файлов в каталоге path

  • GetFileSystemEntries(path): получает список подкаталогов и файлов в каталоге path

  • Move(sourceDirName, destDirName): перемещает каталог

  • GetParent(path): получение родительского каталога

  • GetLastWriteTime(path): возвращает время последнего изменения каталога

  • GetLastAccessTime(path): возвращает время последнего обращения к каталогу

  • GetCreationTime(path): возвращает время создания каталога


Класс DirectoryInfo

Данный класс предоставляет функциональность для создания, удаления,

перемещения и других операций с каталогами. Во многом он похож на Directory, но не является статическим.

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

public DirectoryInfo (string path);

Основные методы класса DirectoryInfo:

  • Create(): создает каталог

  • CreateSubdirectory(path): создает подкаталог по указанному пути path

  • Delete(): удаляет каталог

  • GetDirectories(): получает список подкаталогов папки в виде массива DirectoryInfo

  • GetFiles(): получает список файлов в папке в виде массива FileInfo

  • MoveTo(destDirName): перемещает каталог Основные свойства класса DirectoryInfo:

  • CreationTime: представляет время создания каталога

  • LastAccessTime: представляет время последнего доступа к каталогу

  • LastWriteTime: представляет время последнего изменения каталога

  • Exists: определяет, существует ли каталог

  • Parent: получение родительского каталога

  • Root: получение корневого каталога

  • Name: имя каталога

  • FullName: полный путь к каталогу

Directory или DirectoryInfo

Как видно из функционала, оба класса предоставляют похожие возможности. Когда же и что использовать? Если надо совершить одну-две операции с одним каталогом, то проще использовать класс Directory. Если необходимо выполнить

последовательность операций с одним и тем же каталогом, то лучше воспользоваться классом DirectoryInfo. Почему? Дело в том, что методы класса Directory выполняют дополнительные проверки безопасности. А для класса DirectoryInfo такие проверки не всегда обязательны.

Посмотрим на примерах применение этих классов Пример: Получение списка файлов и подкаталогов

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);

}

}

Обратите внимание на использование слешей в именах файлов. Либо мы используем двойной слеш: "C:\\", либо одинарный, но тогда перед всем путем ставим знак @: @"C:\Program Files"

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

Методы получения папок и файлов позволяют выполнять фильтрацию. В качестве фильтра в эти методы передается шаблон, который может содержать два плейсхолдера: * или символ-звездочка (соответствует любому количеству символов) и ? или вопросительный знак (соответствует одному символу)

Например, найдем все папки, которые начинаются на "books":

// к асс Directory

string[] dirs = Directory.GetDirectories(dirName, "books*.");

// к асс DirectoryInfo

var directory = new DirectoryInfo(dirName);

DirectoryInfo[] dirs = directory.GetDirectories("books*.");

Или получим все файлы с расширением ".exe":

// к асс Directory

string[] files = Directory.GetFiles(dirName, "*.exe");

// к асс DirectoryInfo

var directory = new DirectoryInfo(dirName); FileInfo[] files = directory.GetFiles("*.exe");

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

Класс DirectoryInfo

string path = @"C:\SomeDir"; string subpath = @"program\avalon";

DirectoryInfo dirInfo = new DirectoryInfo(path); if (!dirInfo.Exists)

{

dirInfo.Create();

}

dirInfo.CreateSubdirectory(subpath);

Вначале проверяем, а нету ли такой директории, так как если она существует, то ее создать будет нельзя, и приложение выбросит ошибку. В итоге у нас получится следующий путь: "C:\SomeDir\program\avalon"

Аналогичный пример с классом Directory:

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

{

Directory.CreateDirectory(path);

}

Directory.CreateDirectory($"{path}/{subpath}");


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

string dirName = "C:\\flrogram Files"; DirectoryInfo dirInfo = new DirectoryInfo(dirName);

Console.WriteLine($"Назван е каталога: {dirInfo.N ame}"); Console.WriteLine($"Полное название каталога: {dirInfo.FullName}"); Console.WriteLine($"Время создания каталога: {dirInfo.CreationTime}"); Console.WriteLine($"Корневой каталог:{dirInfo.Root}");

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

Если мы просто применим метод Delete к непустой папке, в которой есть какие- нибудь файлы или подкаталоги, то приложение нам выбросит ошибку. Поэтому нам надо передать в метод Delete дополнительный параметр булевого типа, который

укажет, что папку надо удалять со всем содержимым. Кроме того, перед удалением следует проверить наличие удаляемой папки, иначе приложение выбросит исключение:

string dirName = @"C:\SomeDir";

DirectoryInfo dirInfo = new DirectoryInfo(dirName); if (dirInfo.Exists)

{


}

else

{

}

dirInfo.Delete(true); Console.WriteLine("Каталог удален");




Console.WriteLine("Каталог не существует");



Или так:

string dirName = @"C:\SomeDir"; if (Directory.Exists(dirName))

{



}

else

{

}

Directory.Delete(dirName, true); Console.WriteLine("Каталог удален");




Console.WriteLine("Каталог не существует")

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

При перемещении надо учитывать, что новый каталог, в который мы хотим перемесить все содержимое старого каталога, не должен существовать.

string oldflath = @"C:\SomeFolder"; string newflath = @"C:\SomeDir";

DirectoryInfo dirInfo = new DirectoryInfo(oldflath); if (dirInfo.Exists fifi !Directory.Exists(newflath))

{

dirInfo.MoveTo(newflath);

// так

// Directory.Move(oldflath, newflath);

}

Перемещение каталога в рамках одной папки (как в примере выше) фактически аналогично переименованию папки.

Задание: Напишите программу, которая имеет следующий функционал:

  1. Создание каталога / каталогов

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

  3. Просмотр информации о диске / каталоге

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

Контрольные вопросы:

  1. Что такое файл и какие виды файлов вы знаете?

  2. Какие существуют режимы открытия файлов?