TOC

This article is currently in the process of being translated into Russian (~99% done).

File handling:

File and directory information

Классы File и Directory, которые мы использовали в предыдущих главах, отлично подходят для взаимодействия с папками или файлами напрямую. Тем не менее, иногда нам нужно просто получить информацию о них, и опять же, пространство имен System.IO приходит к нам на помощь: классы FileInfo и DirectoryInfo. В этой главе мы посмотрим на несколько способов использования этих двух классов.

Класс FileInfo

Для начала давайте разберемся с простым способом использования класса FileInfo.

static void Main(string[] args)
{
    FileInfo fi = new FileInfo(System.Reflection.Assembly.GetExecutingAssembly().Location);
    if(fi != null)
Console.WriteLine(String.Format("Information about file: {0}, {1} bytes, last modified on {2} - Full path: {3}", fi.Name, fi.Length, fi.LastWriteTime, fi.FullName));
    Console.ReadKey();
}

Мы создаем новый экземпляр класса FileInfo. Он принимает один параметр - путь к файлу, информацию о котором нам нужно получить. Мы могли бы прописать туда путь к какому-то файлу, однако я подумал, что будет интересно получить информацию об исполняемом файле нашего приложения, над которым мы прямо сейчас работаем - EXE файл нашего проекта после компиляции. Так как мы не имеем доступа к классу Application из консольного приложения (потому что этот класс является частью сборки WinForms), мы используем немного рефлексии для получения пути к текущей сборке. Это выходит за рамки главы, зато вы теперь это знаете.

Теперь у нас есть экземпляр класса FileInfo, мы выведем всю информацию о нем. Попробуйте запустить приложение и вы это увидите. Все легко и просто, и если вы посмотрите на класс FileInfo, вы увидите, что он предлагает даже больше информации, а также ярлыки для методов из File - и почему бы и нет? В любом случае, у нас есть ссылка на файл с экземпляром FileInfo, поэтому мы можем получить те же параметры, что и в классе File.

Класс DirectoryInfo

Информация об одном файле это хорошо, но используя класс DirectoryInfo, мы можем получить информацию обо всех файлах и директориях внутри какой-то определенной директории, что очевидно часто используется в реальных задачах. Давайте я покажу вам простой пример:

DirectoryInfo di = new DirectoryInfo(Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location));
if(di != null)
{
    FileInfo[] subFiles = di.GetFiles();
    if(subFiles.Length > 0)
    {
Console.WriteLine("Files:");
foreach(FileInfo subFile in subFiles)
{
    Console.WriteLine("   " + subFile.Name + " (" + subFile.Length + " bytes)");
}
    }
    Console.ReadKey();
}

Вместо FileInfo, создадим экземпляр DirectoryInfo. Мы используем тот же самый трюк для получения пути к нашему исполняемому файлу, а затем выполним метод GetDirectoryName() из класса Path, чтобы выделить из полного пути только путь к директории. Затем выполним метод GetFiles() для получения массива экземпляров класса FileInfo, каждый из которых представляем файл в директории. После чего переберем их, печатая имя и размер каждого файла.

А если мы захотим в добавок получить и список директорий? Это также легко:

DirectoryInfo[] subDirs = di.GetDirectories();
if(subDirs.Length > 0)
{
    Console.WriteLine("Directories:");
    foreach(DirectoryInfo subDir in subDirs)
    {
Console.WriteLine("   " + subDir.Name);
    }
}

В некоторых ситуациях, нам может понадобиться список файлов или директорий только с определенным именем или расширением файла. К счастью, FileInfo и DirectoryInfo имеют отличное решение и для этой проблемы.

Это выдаст нам все .ехе файлы в директории:

FileInfo[] subFiles = di.GetFiles("*.exe");

А это выдаст все папки, у которых в имени встречается слово "test":

DirectoryInfo[] subDirs = di.GetDirectories("*test*");

Мы даже можем получить и файлы и директории рекурсивно. Это означает, что поиск будет осуществляться и в поддиректориях поддиректории... исходной директории:

FileInfo[] subFiles = di.GetFiles("*.exe", SearchOption.AllDirectories);

Следующим образом будет выглядеть код для поиска только в исходной директории:

FileInfo[] subFiles = di.GetFiles("*.exe", SearchOption.TopDirectoryOnly);

Резюме

Мы можем легко получить информацию о файловой системе на нашем компьютере, используя классы FileInfo и DirectoryInfo.

This article has been fully translated into the following languages: Is your preferred language not on the list? Click here to help us translate this article into your language!