Язык программирования C#9 и платформа .NET5 - Эндрю Троелсен
Шрифт:
Интервал:
Закладка:
using System;
using System.IO;
Console.WriteLine("***** Fun with Directory(Info) *****n");
ShowWindowsDirectoryInfo();
Console.ReadLine();
static void ShowWindowsDirectoryInfo()
{
// Вывести информацию о каталоге. В случае работы не под
// управлением Windows подключитесь к другому каталогу.
DirectoryInfo dir = new DirectoryInfo($@"C{Path.VolumeSeparatorChar}
{Path.DirectorySeparatorChar}Windows");
Console.WriteLine("***** Directory Info *****");
// Информация о каталоге
Console.WriteLine("FullName: {0}", dir.FullName); // Полное имя
Console.WriteLine("Name: {0}", dir.Name); // Имя каталога
Console.WriteLine("Parent: {0}", dir.Parent); // Родительский каталог
Console.WriteLine("Creation: {0}", dir.CreationTime); // Время создания
Console.WriteLine("Attributes: {0}", dir.Attributes); // Атрибуты
Console.WriteLine("Root: {0}", dir.Root); // Корневой каталог
Console.WriteLine("**************************n");
}
Вывод у вас может отличаться, но быть похожим:
***** Fun with Directory(Info) *****
***** Directory Info *****
FullName: C:Windows
Name: Windows
Parent:
Creation: 3/19/2019 00:37:22
Attributes: Directory
Root: C:
**************************
Перечисление файлов с помощью типа DirectoryInfо
В дополнение к получению базовых сведений о существующем каталоге текущий пример можно расширить, чтобы задействовать некоторые методы типа DirectoryInfо. Первым делом мы используем метод GetFiles() для получения информации обо всех файлах *.jpg, расположенных в каталоге С:WindowsWebWallpaper.
На заметку! Если вы не работаете на машине с Windows, тогда модифицируйте код, чтобы читать файлы в каком-нибудь каталоге на вашей машине Не забудьте использовать Path.VolumeSeparatorChar и Path.DirectorySeparatorChar, сделав код межплатформенным.
Метод GetFiles() возвращает массив объектов FileInfo, каждый из которых открывает доступ к детальной информации о конкретном файле (тип FileInfo будет подробно описан далее в главе). Создайте в классе Program следующий статический метод:
static void DisplayImageFiles()
{
DirectoryInfo dir = new
DirectoryInfo(@"C:WindowsWebWallpaper");
// Получить все файлы с расширением *.jpg.
FileInfo[] imageFiles =
dir.GetFiles("*.jpg", SearchOption.AllDirectories);
// Сколько файлов найдено?
Console.WriteLine("Found {0} *.jpg filesn", imageFiles.Length);
// Вывести информацию о каждом файле.
foreach (FileInfo f in imageFiles)
{
Console.WriteLine("***************************");
Console.WriteLine("File name: {0}", f.Name // Имя файла
Console.WriteLine("File size: {0}", f.Length); // Размер
Console.WriteLine("Creation: {0}", f.CreationTime); // Время создания
Console.WriteLine("Attributes: {0}", f.Attributes); // Атрибуты
Console.WriteLine("***************************n");
}
}
Обратите внимание на указание в вызове GetFiles() варианта поиска; SearchOption.AllDirectories обеспечивает просмотр всех подкаталогов корня. В результате запуска приложения выводится список файлов, которые соответствуют поисковому шаблону.
Создание подкаталогов с помощью типа DirectoryInfo
Посредством метода DirectoryInfo.CreateSubdirectory() можно программно расширять структуру каталогов. Он позволяет создавать одиночный подкаталог, а также множество вложенных подкаталогов в единственном вызове. В приведенном ниже методе демонстрируется расширение структуры каталога, в котором запускается приложение (обозначаемого с помощью .), несколькими специальными подкаталогами:
static void ModifyAppDirectory()
{
DirectoryInfo dir = new DirectoryInfo(".");
// Создать MyFolder в каталоге запуска приложения.
dir.CreateSubdirectory("MyFolder");
// Создать MyFolder2Data в каталоге запуска приложения.
dir.CreateSubdirectory(
$@"MyFolder2{Path.DirectorySeparatorChar}Data");
}
Получать возвращаемое значение метода CreateSubdirectory() не обязательно, но важно знать, что в случае его успешного выполнения возвращается объект DirectoryInfo, представляющий вновь созданный элемент. Взгляните на следующую модификацию предыдущего метода:
static void ModifyAppDirectory()
{
DirectoryInfo dir = new DirectoryInfo(".");
// Создать MyFolder в начальном каталоге.
dir.CreateSubdirectory("MyFolder");
// Получить возвращенный объект DirectoryInfo.
DirectoryInfo myDataFolder = dir.CreateSubdirectory(
$@"MyFolder2{Path.DirectorySeparatorChar}Data");
// Выводит путь к ..MyFolder2Data.
Console.WriteLine("New Folder is: {0}", myDataFolder);
}
Вызвав метод ModifyAppDirectory() в операторах верхнего уровня и запустив программу, в проводнике Windows можно будет увидеть новые подкаталоги.
Работа с типом Directory
Вы видели тип DirectoryInfo в действии и теперь готовы к изучению типа Directory. По большей части статические члены типа Directory воспроизводят функциональность, которая предоставляется членами уровня экземпляра, определенными в DirectoryInfo. Тем не менее, вспомните, что члены типа Directory обычно возвращают строковые данные, а не строго типизированные объекты FileInfo/DirectoryInfo.
Давайте взглянем на функциональность типа Directory; показанный ниже вспомогательный метод отображает имена всех логических устройств на текущем компьютере (с помощью метода Directory.GetLogicalDrives()) и применяет статический метод Directory.Delete() для удаления созданных ранее подкаталогов MyFolder и MyFolder2Data:
static void FunWithDirectoryType()
{
// Вывести список всех логических устройств на текущем компьютере.
string[] drives = Directory.GetLogicalDrives();
Console.WriteLine("Here are your drives:");
foreach (string s in drives)
{
Console.WriteLine("--> {0} ", s);
}
// Удалить ранее созданные подкаталоги.
Console.WriteLine("Press Enter to delete directories");
Console.ReadLine();
try
{
Directory.Delete("MyFolder");
// Второй параметр указывает, нужно ли удалять внутренние подкаталоги.
Directory.Delete("MyFolder2", true);
}
catch (IOException e)
{
Console.WriteLine(e.Message);
}
}
Работа с типом DriveInfo
Пространство имен System.IO содержит класс по имени DriveInfo. Подобно Directory.GetLogicalDrives() статический метод DriveInfo.GetDrives() позволяет выяснить имена устройств на машине. Однако в отличие от Directory.GetLogicalDrives() метод DriveInfo.GetDrives() предоставляет множество дополнительных деталей (например, тип устройства, доступное свободное пространство и метка тома). Взгляните на следующие операторы верхнего уровня в новом проекте консольного приложения DriveInfоАрр:
using System;
using System.IO;
// Получить информацию обо всех устройствах.
DriveInfo[] myDrives = DriveInfo.GetDrives();
// Вывести сведения об устройствах.
foreach(DriveInfo d in myDrives)
{
Console.WriteLine("Name: {0}", d.Name); // имя
Console.WriteLine("Type: {0}", d.DriveType); // тип
// Проверить, смонтировано ли устройство.
if(d.IsReady)
{
Console.WriteLine("Free space: {0}", d.TotalFreeSpace);
// свободное пространство