This article has been localized into Russian by the community.
Информация о файлах и каталогах
Классы 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.