Управляем своими дисками с помощью C#
Неважно, какую ОС вы используете и на каком языке работаете, рано или поздно вы должны будете выяснить, какие устройства хранения данных (диски), доступны в системе. Для этого можно использовать и .NET. Итак, в статье ниже рассмотрим, как можно получить информацию о дисках с помощью си шарп.
Для этого нам нужен класс DriveInfo. Как и остальные классы, которые используются для управления файлами и папками, DriveInfo подключается с помощью пространства имен "System.IO".
Точка входа в класс DriveInfo - это один единственным статический метод в классе - GetDrives. GetDrives возвращает массив объектов, уникальный для каждого из активных устройств хранения данных, имеющихся в вашей системе.
Создайте у себя небольшое консольное приложение и добавьте следующие строки в program.cs:
using System; using System.IO; namespace CodeUp7 { class Program { static void Main(string[] args) { DriveInfo[] dis = DriveInfo.GetDrives(); try { foreach (DriveInfo di in dis) { Console.WriteLine("Диск {0} имеется в системе.", di.Name); } } catch (IOException e) { Console.WriteLine(e.GetType().Name); } Console.ReadKey(); } } }После компиляции и запуска у вас должно получиться что-то вроде этого:
Да, у меня в системе 5 устройств и, как видите, мы можем сразу распознать их все по стандартному синтаксису - букве. Однако это еще не все, что доступно в классе DriveInfo. Измените строку, в которой выводится информация на консоль на следующую:
Console.WriteLine("Диск {0} имеется в системе с меткой тома {1}.", di.Name, di.VolumeLabel);Затем снова запустите приложение, теперь вы должны увидеть примерно следующее:
На самом деле, у вас может и не выскочить исключение, это просто у меня так получилось. Но, так как класс DriveInfo также возвращает информацию о компакт-дисках и съемные носителях, то есть немалая вероятность во время пробега по массиву получить проблему на картинке выше. В данном случае, мой код выдал исключение, как только он попытался отправить запрос в пустой привод компакт-дисков.
Изменим еще раз строку вывода на консоль:
Console.WriteLine("Диск {0} имеется в системе и его тип {1}.", di.Name, di.DriveType);Затем запустим снова. На этот раз вы не должны увидеть каких-либо исключений, программа должна вывести типы приводов:
"Fixed" - это обычно жесткий диск или другой несъемный диск, "CdRom" означает не только непосредственно компакт-диски, но также карты памяти, модемы. Следует быть осторожными именно с типом "Fixed". К ним могут также принадлежать и внешние жесткие USB-диски.
Итак, теперь мы знаем, как определить наш тип привода, но можно ли предотвратить не совсем красивые исключения? Помимо старого доброго способа отлавливания исключений можно проверить свойство объекта IsReady на DriveInfo.
Добавим условие для каждого цикла:
foreach (DriveInfo di in dis) { if(di.IsReady) { Console.WriteLine("Диск {0} имеется в системе с меткой тома {1}.", di.Name, di.VolumeLabel); } }После запуска программы сейчас у вас не должно быть исключений, но выведутся только те диски, которые доступны для чтения в настоящий момент:
Если вы вставите CD в дисковод компакт-дисков или SD-карту в кард-ридер, а затем снова запустите приложение, то вы увидите, что они тоже появятся в программе. Любые диски, которые не готовы к использованию, просто игнорируются.
Остальные свойства
Класс DriveInfo может предоставить больше информации об устройстве. Перечислим остальные его свойства:
- AvailableFreeSpace: свободное пространство, измеряемое в байтах, доступное для использования на устройстве;
- DriveFormat: строка, содержащая формат устройства; например, "файловая система NTFS" или "FAT32";
- RootDirectory: строка, содержащую корневую папку файловой системы. В большинстве случаев она будет совпадать с именем устройства, но для NT томов или подключенные сетевых дисков путь может быть в аппаратном формате или UNC-формате;
- TotalSize: общий объем пространства, измеряемый в байтах, который доступен на устройстве.
Как вы можете видеть, это все то, что отображается, если открыть "Мой компьютер". Однако интересней же самим сделать программу, к примеру, вычисляющую свободное место у подключенного устройства, разве нет?
Автор этого материала - я - Пахолков Юрий. Я оказываю услуги по написанию программ на языках Java, C++, C# (а также консультирую по ним) и созданию сайтов. Работаю с сайтами на CMS OpenCart, WordPress, ModX и самописными. Кроме этого, работаю напрямую с JavaScript, PHP, CSS, HTML - то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.
Отправляя сообщение я подтверждаю, что ознакомлен и согласен с политикой конфиденциальности данного сайта.