Содержание
Аналогично тому, как организована работа с каталогами в C#, для работы с файлами в пространстве имен System.IO предусмотрено два класса для работы с файлами — File и FileInfo. Рассмотрим как можно использовать эти классы при работе с файловой системой в C#. Однако, прежде, чем мы приступим к рассмотрению функциональности новых классов, необходимо рассмотреть вопрос о том, как получить список файлов в определенном каталоге.
DirectoryInfo (продолжение)
При рассмотрении вопросов, связанных с работой с каталогами файловой системы в C# мы оставили не рассмотренным вопрос о том, как получить список файлов в директории. Рассмотрим этот вопрос сейчас. В самом простом случае, мы можем воспользоваться методом GetFiles(), например, так:
using System;
using System.IO;
namespace FileSystem
{
class Program
{
static void Main(string[] args)
{
string root = @"C:\";
try
{
DirectoryInfo directory = new DirectoryInfo(root);
FileInfo[] files = directory.GetFiles();
foreach (FileInfo file in files)
{
Console.WriteLine(file.FullName);
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
}
}
В этом случае программа выдаст нам список всех файлов находящихся в определенном каталоге. В приведенном выше примере вывод консоли будет примерно следующим:
C:\DumpStack.log.tmp
C:\hiberfil.sys
C:\pagefile.sys
C:\swapfile.sys
То есть, при использовании метода GetFiles() без параметров просматривается только конкретный каталог. У метода GetFiles() имеется ряд переопределенных версий, позволяющих организовать поиск вглубь для того, чтобы вывести список файлов, находящихся не только в конкретном каталоге, но и во всех поддиректориях. Например, просмотрим все файлы в каталоге C:\Program Files (x86)
string root = @"c:\Program Files (x86)\";
try
{
DirectoryInfo directory = new DirectoryInfo(root);
FileInfo[] files = directory.GetFiles("*.*",SearchOption.AllDirectories);
foreach (FileInfo file in files)
{
Console.WriteLine(file.FullName);
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
Здесь мы воспользовались переопределенной версией метода GetFiles() у которого первый параметр представляет собой маску по которой будут искаться файлы (например, мы могли бы задать вот такую маску для поиска только текстовых файлов — «*.txt«), а второй параметр — настройки поиска (в нашем случае — это SearchOption.AllDirectories, что указывает на то, что поиск будет вестись по всех каталогам).
Отдельное внимание стоит уделить такому моменту: если вы попытаетесь провести поиск как в примере по всем каталогам на диске C:\, то можете столкнуться ситуацией, когда программа вместо списка файлов выдаст вам исключение типа «Access to the path ‘c:\Documents and Settings’ is denied.» Это связано с тем, что для каждой директории в Windows можно установить права доступа для определенных пользователей и наша программа на C# не может зайти в директорию так как не обладает достаточными для этого правами. Самый простой способ избежать это исключение состоит в том, чтобы организовать свой рекурсивный обход дерева каталогов. Этот момент мы с вами также рассмотрим в последующих статьях. Ну а теперь перейдем непосредственно к нашей теме.
Класс FileInfo
Ниже представлены наиболее часто используемые свойства и методы работы с файлами посредством класса FileInfo:
CopyTo(path)— копирует файл в новое место по указанному путиpathCreate()— создает файлDelete()— удаляет файлMoveTo(destFileName)— перемещает файл в новое место- Свойство
Directory— получает родительский каталог в виде объектаDirectoryInfo - Свойство
DirectoryName— получает полный путь к родительскому каталогу - Свойство
Exists— указывает, существует ли файл - Свойство
Length— получает размер файла в байтах - Свойство
Extension— получает расширение файла - Свойство
Name— получает имя файла - Свойство
FullName— получает полное имя файла
Как в C# создать файл и записать в него данные?
Для создания нового файла и записи в него данных можно воспользоваться методом Create():
using System;
using System.IO;
using System.Text;
namespace FileSystem
{
class Program
{
static void Main(string[] args)
{
try
{
FileInfo fileInfo = new FileInfo(@"c:\CSharp Output\MyFile.txt");
FileStream fs = fileInfo.Create();
fs.Write(Encoding.UTF8.GetBytes("Привет, мир!"));
fs.Close();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
}
}
Или же, если мы точно знаем, что нам необходим текстовый файл, то воспользоваться методом CreateText():
using System;
using System.IO;
namespace FileSystem
{
class Program
{
static void Main(string[] args)
{
try
{
FileInfo fileInfo = new FileInfo(@"c:\CSharp Output\MyFile.txt");
StreamWriter sw = fileInfo.CreateText();
sw.WriteLine("Привет, мир!");
sw.Close();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
}
}
В отличие от Create() метод CreateText() возвращает нам объект типа StreamWriter, который предоставляет удобные методы и свойства для работы в том числе и со строками, поэтому во втором примере нам не понадобилось преобразовывать строку в массив байтов для записи в файл. В свою очередь, метод Create() удобно использовать для записи бинарных файлов.
Как в C# получить информацию о файле?
Чтобы получить информацию о файле мы можем воспользоваться свойствами класса FileInfo, например, как показано ниже:
try
{
FileInfo fileInfo = new FileInfo(@"c:\CSharp Output\MyFile.txt");
Console.WriteLine($"Полное имя файла: {fileInfo.FullName}");
Console.WriteLine($"Дата создания: {fileInfo.CreationTime}");
Console.WriteLine($"Дата последнего доступа: {fileInfo.LastAccessTime}");
Console.WriteLine($"Дата последней записи в файл: {fileInfo.LastWriteTime}");
Console.WriteLine($"Размер файла: {fileInfo.Length}");
Console.WriteLine($"Имя файла: {fileInfo.Name}");
Console.WriteLine($"Директория в которой содержится файл: {fileInfo.DirectoryName}");
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
Как в C# переместить файл в новое место?
Для перемещения файла в другой каталог в C# используется метод MoveTo():
string path = @"c:\CSharp Output\MyFile.txt";
string newPath = @"c:\CSharp Output\SubDir\MyFile.txt";
FileInfo fileInf = new FileInfo(path);
if (fileInf.Exists)
{
fileInf.MoveTo(newPath);
}
Перед тем, как перемещать файл в другой каталог необходимо обязательно проверить существование этого каталога на диске и, если каталог отсутствует, то создать его, иначе мы получим исключение.
Как в C# копировать файл?
Копирование файла в C# осуществляется с помощью метода CopyTo():
string path = @"c:\CSharp Output\MyFile.txt";
string newPath = @"c:\CSharp Output\SubDir\MyFile.txt";
FileInfo fileInf = new FileInfo(path);
if (fileInf.Exists)
{
fileInf.CopyTo(newPath);
}
Методы CopyTo() и MoveTo() класса FileInfo также имет переопределенные версии в которых вторым параметром выступает параметр булевого типа (bool) который указывает на то, необходимо ли перезаписать содержимое файла, если он уже содержится по указанному пути. Если этот параметр равен false (или используется метод с одним параметром), то при обнаружении по новому пути указанного файла C# сгенерирует исключение.
Как в C# удалить файл?
Для удаления файла с диска в C# используется метод Delete():
string path = @"c:\CSharp Output\MyFile.txt";
FileInfo fileInf = new FileInfo(path);
if (fileInf.Exists)
{
fileInf.Delete();
}
Класс File
Класс File реализует схожую с FileInfo функциональность, однако, как и в случае работы с каталогами, этот класс рекомендуется использовать если вам необходима проверка безопасности используемых методов по работе с файлом и вы не планируете использовать класс многократно. Основные методы работы с файлами в C# с использованием класса File следующие:
Copy()— копирует файл в новое местоCreate()— создает файлDelete()— удаляет файлMove()— перемещает файл в новое местоExists(file)— определяет, существует ли файл
Подробно описывать работу каждого методы не будем, так как они реализуют ровно те же операции, что и в классе FileInfo.
Итого
Рассмотрели работу с файлами в C#, остановившись подробнее на работе с классом FileInfo. Научились создавать файлы и записывать в них данные, перемещать, копировать и удалять файлы в C#, а также получать информацию о конкретном файле.