Поиск на сайте
Главная Журнал Форум Wiki DRKB Страны мира

Работа с файлами в 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());
 
//Удаление файла Myprogram.txt.
 
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 так же можно указать кодировку, в которой будет текст.




Основные разделы сайта


 

Реклама