Практическая работа №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);
}
Перемещение каталога в рамках одной папки (как в примере выше) фактически аналогично переименованию папки.
Задание: Напишите программу, которая имеет следующий функционал:
Создание каталога / каталогов
Перемещение каталога
Просмотр информации о диске / каталоге
Удаление каталога.
Контрольные вопросы:
Что такое файл и какие виды файлов вы знаете?
Какие существуют режимы открытия файлов?