Работа с файлами в C#
В этой статье вы узнаете, как работать с директориями и файлами в
системе. Кроме того, мы обсудим вопросы чтения и записи в файл,
используя мощные классы .NET.
Пространство имен
System.IO содержит все необходимые классы, методы и свойства для
манипуляций с каталогами и файлами (В Таблице 1 приведены основные
классы).
Класс |
Применение |
Binary Reader и Writer |
Чтение и запись простых типов данных |
Directory, File, DirectoryInfo и FileInfo |
Создание, удаление и перемещение файлов и директорий.
Получение подробной информации о файлах, при помощи свойств,
определенных в этих классах. |
FileStream |
Доступ к файлам потоковым способом |
MemoryStream |
Доступ к данным храняшимся в памяти |
StreamWriter и StreamReader |
Чтение и запись текстовой информации |
StringReader и StringWriter |
Чтение и запись текстовой информации из строкового буфера |
Таблица 1 - классы в System.IO
Работа с классами DirectoryInfo и FileInfo
Классы DirectoryInfo и FileInfo унаследованы от FileSystemInfo,
который является абстрактным. Это значит, что Вы не можете унаследовать
от него свой класс,
но можете использовать свойства, определённые в нём. Таблица 2
перечисляет его свойства и методы.
Свойства |
Назначение |
Attributes |
Возвращает атрибуты файла в виде значений перечисления FileAttributes |
CreationTime |
Возвращает время создания файла |
Exists |
Проверяет является ли файл директорией или нет |
Extension |
Возвращает расширение файла |
LastAccessTime |
Возвращает время последнего доступа к файлу |
FullName |
Возвращает полный путь к файлу |
LastWriteTime |
Возвращает время последнего изменения файла |
Name |
Возвращает имя данного файла |
Delete() |
Удаляет файл. Будьте осторожны при использовании этого метода. |
Таблица 2 - свойства и методы класса FileSystemInfo
Класс DirectoryInfo содержит методы для создания, перемещение и
удаление каталогов. Чтобы использовать вышеприведённые свойства,
необходимо создать объект
класса DirectoryInfo как показано в примере:
DirectoryInfo dir1 = new DirectoryInfo(@"F:\WINNT");
После этого уже можно просмотреть свойства директории при помощи объекта dir1, как показано на фрагмент кода:
Console.WriteLine("Full Name is : {0}", dir1.FullName);
Console.WriteLine("Attributes are : {0}",
dir1.Attributes.ToString());
Можно также использовать значения перечисления FileAttributes. Они приведены в таблице 3.
Свойства |
Назначение |
Archive |
Возвращает Архивный статус файла |
Compressed |
Позволяет узнать сжат файл или нет |
Directory |
Показывает является ли файл директорией или нет |
Encrypted |
Показывает закодирован файл или нет |
Hidden |
Показывает скрыт файл или нет |
Offline |
Показывает, что данные отсутствуют |
ReadOnly |
Показывает является ли файл только для чтения |
System |
Показывает, является ли файл системным (возможно файл в директории Windows) |
Работа с файлами в директории
Предположим, вы хотите получить список всех файлов с расширением BMP в
папке F:\Pictures. Для этого можно использовать следующий код:
DirectoryInfo dir = new DirectoryInfo(@"F:\WINNT");
FileInfo[] bmpfiles = dir.GetFiles("*.bmp);
Console.WriteLine("Total number of bmp files", bmpfiles.Length);
Foreach( FileInfo f in bmpfiles)
{
Console.WriteLine("Name is : {0}", f.Name);
Console.WriteLine("Length of the file is : {0}", f.Length);
Console.WriteLine("Creation time is : {0}", f.CreationTime);
Console.WriteLine("Attributes of the file are : {0}",
f.Attributes.ToString());
}
Создание подкаталогов
Следующий фрагмент кода описывает как можно создать поддиректорию MySub в директории Sub:
DirectoryInfo dir = new DirectoryInfo(@"F:\WINNT");
try
{
dir.CreateSubdirectory("Sub");
dir.CreateSubdirectory(@"Sub\MySub");
}
catch(IOException e)
{
Console.WriteLine(e.Message);
}
Создание файлов при помощи класса FileInfo
Класс FileInfo позволяет создавать новые файлы, получать информацию,
удалять и перемещать их. В этом классе также есть методы для открытия,
чтения и записи в файл. В следующем примере показано, как можно создать
текстовый файл и получить доступ к его информации (времени его создания,
полное имя, и так далее):
FileInfo fi = new FileInfo(@"F:\Myprogram.txt");
FileStream fstr = fi.Create();
Console.WriteLine("Creation Time: {0}",f.CreationTime);
Console.WriteLine("Full Name: {0}",f.FullName);
Console.WriteLine("FileAttributes: {0}",f.Attributes.ToString());
Console.WriteLine("Press any key to delete the file");
Console.Read();
fstr.Close();
fi.Delete();
Описание метода Open()
В классе FileInfo есть метод под названием Open () с помощью которого
можно создавать файлы, подставляя в параметры значения перечислений
FileMode и FileAccess.
Следующий фрагмент кода показывает, как это делается:
FileInfo f = new FileInfo("c:\myfile.txt");
FileStream s = f.Open(FileMode.OpenorWrite, FileAccess.Read);
После этого, используя объект 's', можно читать и записывать в файл. В
перегруженном методе Open() можно только читать из файла.
Для записи в файл необходимо в параметрах открытия использовать значение
FileAccess.ReadWrite.
Таблицы 4 и 5 содержат возможные значения FileMode и FileAccess.
Значение |
Применение |
Append |
Для открытия файла и добавления данных. Используется совместностно со значением FileAccess.Write. |
Create |
Для создания нового файла. Если файл уже существует, то он затирается. |
CreateNew |
Для создания нового файла. Если файл существует, то возникает исключение IOException. |
Open |
Для открытия существующего файла |
OpenOrCreate |
Для открытия существующего или создания нового файла. Если файл не существует, тобудет создан новый. |
Truncate |
Для урезания существующего файла |
Таблица 4 - значения FileMode
Значения |
Применение |
Read |
Для чтения (получения) данных из файла |
ReadWrite |
Для записи в или чтения из файла |
Write |
Для записи данных в файл |
Таблица 5 - значения FileAccess
Запись в текстовый файл при помощи класса StreamWriter
Текстовые данные или любую другую информацию можно записать в файл
используя метод CreateText() в классе FileInfo. Однако предварительно
необходимо
получить валидный StreamWriter. Именно StreamWrite обеспечивает
необходимую функциональность для записи в файл. Следующий пример
иллюстрирует это:
FileInfo f = new FileInfo("Mytext.txt")
StreamWriter w = f.CreateText();
w.WriteLine("This is from");
w.WriteLine("Chapter 6");
w.WriteLine("Of C# Module");
w.Write(w.NewLine);
w.WriteLine("Thanks for your time");
w.Close();
Чтение из текстового файла
Для чтения из текстового файла можно воспользоваться классом
StreamReader. Для этого необходимо указать имя файла в статическом
методе OpenText() класса File.
Следующий пример считывает содержимое файла, которое было записано в
предыдущем примере:
Console.WriteLine("Reading the contents from the file");
StreamReader s = File.OpenText("Mytext.txt");
string read = null;
while ((read = s.ReadLine()) != null)
{
Console.WriteLine(read);
}
s.Close();
Работа с разными кодировками.
По умолчанию в .NET все текстовые данные в кодировке UTF8, но часто
требуется считать текстовый файл, сохраненный в другой кодировке,
допустим в WIN1251. В таком случае если в файле был русский текст в
кодировке WIN1251, при считывании его в UTF8 мы получим нечитаемые
данные. Для того чтобы переводить строки из одной кодировки в другую
существует класс Encoding из пространства имен System.Text, благодаря
которому зная исходную кодировку мы можем привести текстовые данные к
нужной кодировке. Рассмотрим следующий пример, например, мы хотим
конвертировать считанную строку в кодировке WIN1251 в кодировку
DOS(866), для этого мы можем использовать следующий код:
class Program
{
private static string in1251;
private static readonly Encoding enc1251 = Encoding.GetEncoding(1251);
private static readonly Encoding enc866 = Encoding.GetEncoding(866);
static void Main(string[] args)
{
//....
//тут каким то образом получаем данные в in1251
byte[] sourceBytes = enc1251.GetBytes(in1251);
string outputString = enc866.GetString(sourceBytes);
//далее делаем то что требуется с полученной строкой
//....
}
}
В sourceBytes мы получили входную строку в виде массива байт, которые
далее мы можем так же посредством Encoding сохранить в строку с нужной
кодировкой. В случае, когда мы читаем текст уже известной кодировке из
файла, дела обстоят еще проще. При создании экземпляра StreamReader мы
можем явно указать кодировку источника, код будет выглядеть следующим
образом:
using (var sr = new StreamReader("Mytext.txt", Encoding.GetEncoding(1251)))
{
string read = null;
while ((read = sr.ReadLine()) != null)
Console.WriteLine(read);
}
При записи в файл в нужной кодировке для StreamWriter так же можно указать кодировку, в которой будет текст.
|