Работа с файлами в C#

Работа с файлами в C#

Всем доброго времени суток. На связи Алексей Гулынин. В прошлой статье вы узнали немного о том, что такое модульное тестирование в Visual Studio. В данной статье я бы хотел рассказать о работе с файлами на C#. Всю работу с файлами можно разделить на 2 группы: 1) это работа с файлами, как с элементами файловой системы, например, найти файл, получить список файлов в директории, узнать дату изменения файла, различные его атрибуты, расширение, скопировать или удалить файл, создать новый. 2) это работа с содержимым файла: прочитать файл или записать в него что-нибудь.

Для выполнения всех этих операций существует несколько классов, расположенных в пространстве имён "System.IO".

Существует 2 класса File и FileInfo, которые предназначены для работы с файлом, как с частью файловой системы. Здесь также есть несколько методов, которые позволяют работать с содержимым файла целиком. В простых случаях (когда размеры файла небольшие, скажем до 1МБ) файл можно полностью прочитать и сохранить в память.

Некоторые методы по работе с файлами:
  • ReadAllText(). Самая простая операция — это прочитать файл целиком. Данный метод является статическим. Здесь в качестве параметра можно указать полный путь к файлу. Когда указываем путь к файлу, не забываем экранировать символ "\".
  • ReadAllLines(). Этот статический метод возвращает массив строк, т.е. читает файл построчно.
  • WriteAllText(). Здесь в качестве параметра передаём строку, и эта строка целиком добавляется в файл с перезаписью содержимого файла.
  • AppendAllText(). Здесь содержимое добавляется поверх существующего файла, без его перезаписи.

Ниже приведен пример на эти методы. Для начала подготовим тестовый файл, который заполним названиями городов (Москва, Питер, Казань, Уфа, Стерлитамак). Имя каждого города находится на новой строке. Файл назовем "cities.txt" и расположим его в корне какого-нибудь диска (в моём случае — это диск "E"):

using System;
using System.Text;
using System.IO;
namespace TestApplicationForStudy
{
  class Program
  {
    static void Main(string[] args)
    {
      string pathToFile = "E:\\cities.txt";
      // можно также указать вот так pathToFile = @"E:\cities.txt";
      // выведем содержимое файла целиком
      string readAllFile = File.ReadAllText(pathToFile);
      Console.WriteLine(readAllFile); // выйдет весь файл
      string[] readEveryLine = new string[5];
      // записываем в массив каждую строку файла
      readEveryLine = File.ReadAllLines(pathToFile);
      // выводим содержимое массива
      for (int i = 0; i < readEveryLine.Length; i++) 
          Console.Write(readEveryLine[i] + " | ");
      // Попробуем добавить новый город в наш файл
      // Данная команда перезатрёт наш файл, и в нём будет только "Нижний Новгород"
      //File.WriteAllText(pathToFile, "Нижний Новгород");
      // Следующая команда допишет новый город в конец файла
      File.AppendAllText(pathToFile, Environment.NewLine); // Добавим новую строку в наш файл
      File.AppendAllText(pathToFile, "Нижний Новгород");
      Console.ReadLine();
    }
  }
}

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

Реализуем следующий алгоритм: необходимо вывести все файлы, даты изменения которых старше введенной пользователем даты. Будем рассматривать папку "C:\Windows\System32". В ней много файлов. Тут нам потребуется получить все файлы этой директории. Забегая вперед скажу, что это можно сделать с помощью метода "GetFiles()" класса "DirectoryInfo".

using System;
using System.Text;
using System.IO;
namespace TestApplicationForStudy
{
  class Program
  {
    static void Main(string[] args)
    {
      string pathToDirectory = @"C:\Windows\System32";
      // Получаем пользовательскую дату
      // Будем вводить в формате 27.04.2016 без проверки на корректность ввода
      Console.Write("Введите дату: ");
      string userDate = Console.ReadLine();
      userDate += " 00:00:00";
      Console.WriteLine("Вы ввели дату: {0}", userDate);
      // сохраняем названия всех файлов в переменную allFiles (массив строк)
      DirectoryInfo dI = new DirectoryInfo(pathToDirectory);
      FileInfo[] allFiles = dI.GetFiles();
      try
      {
        // В цикле пройдём по всем файлам и проверим их дату изменения
        foreach (FileInfo fi in allFiles)
        {
          // Если дата изменения файла старше нашей
          if (fi.LastWriteTime > DateTime.Parse(userDate))
          {
            // выводим этот файл
            Console.WriteLine("{0} | {1}", fi.Name, fi.LastWriteTime.ToString());
          }
        }
      }
      catch (IOException ex)
      {
        Console.WriteLine("Произошла ошибка: {0}", ex.Message);
      } 

      Console.ReadLine();
    }
  }
}

Протестируйте работу данного скрипта.

Напишем ещё несколько примеров на работу с файлами:

  • Copy — копирование файла.
  • Delete — удаление файла.
  • Exists — проверка существования файла.

Пример:

static void Main(string[] args)
{
  string pathToFile = @"E:\cities.txt";
  // Скопируем наш файл на локальный диск C
  // true говорит о том, что файл будет перезаписан
  File.Copy(pathToFile, @"C:\cities.txt", true);
  // Проверим существует ли файл с помощью тернарного оператора
  string message = (File.Exists(pathToFile)) ? "Файл существует" : "Файл не существует";
  Console.WriteLine(message);
  // Удалим наш файл с диска C
  File.Delete(@"C:\cities.txt");
  Console.ReadLine();
}

В качестве домашнего задания: переделайте последний пример только с использованием класса "FileInfo".

В данной статье вы узнали, как работать с файлами в C#.

На связи был Алексей Гулынин, оставляйте свои комментарии, увидимся в следующих статьях.


Комментарии:

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *