C#. Класс FileStream. Дополнительные опции записи/чтения. Перечисление FileOptions

Класс FileStream. Дополнительные опции записи/чтения. Перечисление FileOptions. Примеры

Данная тема есть продолжением темы:


Содержание


Поиск на других ресурсах:




1. Перечисление FileOptions. Назначение

Класс FileStream имеет ряд конструкторов, с помощью которых можно устанавливать различные режимы доступа к файлу. Согласно документации один из конструкторов класса FileStream имеет следующий вид:

public FileStream(string path, System.IO.FileMode mode, System.IO.FileAccess access, System.IO.FileShare share, int bufferSize, System.IO.FileOptions options)

здесь

  • path – путь к файлу или имя файла;
  • mode – константа из перечисления FileMode, которая определяет режим открытия файла. Более подробно о перечислении FileMode можно прочитать здесь;
  • access – константа из перечисления FileAccess, которая определяет способ доступа к файлу. Более подробно о перечислении FileAccess можно прочитать здесь;
  • share – значение из перечисления FileShare, которое определяет возможность использования файла как общего ресурса различными процессами;
  • bufferSize – размер буфера, который используется для порционной записи/чтения данных в файле. По умолчанию bufferSize = 4096;
  • options – константа из перечисления FileOptions, которая определяет различные опции использования файла.

В перечислении FileOptions реализованы дополнительные возможности (опции), которые определяют назначение открытого файла:

  • Asynchronous – указывает, что файл может быть использован для асинхронного чтения и записи;
  • DeleteOnClose – указывает, что файл будет удален после того, как он больше не будет использоваться;
  • Encrypted – указывает, что файл зашифрован и его можно расшифровать только с помощью того же аккаунта пользователя, используемого для шифрования;
  • None – указывает, что никаких дополнительных опций не применяется для создаваемого объекта типа FileStream;
  • RandomAccess – указывает на то, что к файлу осуществляется случайный доступ. Это указание дает системе подсказку для оптимизации кэширования файлов;
  • SequentialScan – указывает на то, что файл читается последовательно от начала до конца. Это указание может быть использовано в качестве подсказки системе осуществить оптимизацию кэширования файлов. Это может дать некоторое повышение производительности;
  • WriteThrough – указание системе осуществлять запись через любой промежуточный кэш и переходить непосредственно на диск.

 

2. Примеры обработки (запись / чтение) файла с заданными дополнительными возможностями FileOptions
2.1. Создание файла с использованием опций из перечисления FileOptions

В фрагменте кода создается файл для асинхронного чтения и записи. Размер буфера устанавливается равным 8192 байта. Файл может быть использован для асинхронного чтения и записи.

...

// Создание файла для асинхронного чтения и записи
using (FileStream fs = new FileStream("file.bin", FileMode.Create,
FileAccess.ReadWrite, FileShare.None, 4096, FileOptions.Asynchronous))
{
  // Использование fs для обработки файла
  ...
}

...

Если в вышеприведенном коде, в конструкторе значение

FileOptions.Asynchronous

заменить кодом

FileOptions.Asynchronous | FileOptions.DeleteOnClose

то после создания и использования, файл с именем file.bin будет удален.

Таким же способом можно задавать другие дополнительные опции управления файлом из перечисления FileOptions.

 

2.2. Открытие файла для записи

Чтобы открыть файл для записи с установленным случайным доступом, можно использовать следующий код:

...

// Открытие файла для записи
using (FileStream fs = new FileStream("file1.bin", FileMode.OpenOrCreate,
FileAccess.Write, FileShare.Write, 2048, FileOptions.RandomAccess))
{
  ...
}

...

В вышеприведенном фрагменте создается файл с именем file1.bin. Режим открытия устанавливается равным OpenOrCreate (открыть ранее созданный файл или создать новый файл). Режим доступа устанавливается равным FileAccess.Write. Константа FileShare.Write указывает, что файл может быть общим ресурсом для записи из различных процессов (потоков). Размер буфера составляет 2048 байт. Константа FileOptions указывает, что к файлу осуществляется случайный доступ.

 

2.3. Открытие файла для чтения. Пример побайтного асинхронного чтения файла

Чтобы открыть файл для чтения с использованием констант из перечисления FileOptions можно использовать, например, следующий код

...

// Открытие файла для чтения
using (FileStream fs = new FileStream("file3.bin", FileMode.Open,
FileAccess.Read, FileShare.Read, 2048, FileOptions.Asynchronous))
{
  // Считать байты из файла, пока не будет достигнут конец файла
  // и записать эти данные в массив A

  // Выделить память для буфера
  byte[] A = new byte[fs.Length];

  // дополнительные переменные
  int t, i;

  // Цикл побайтного чтения данных
  i = 0;
  do
  {
    t = fs.ReadByte(); // прочитать байт
    if (t != -1)
      A[i++] = (byte)t;
  }
  while (t != -1);
}

...

В предыдущем примере побайтно читается файл file3.bin. Файл открыт для асинхронного чтения. Считанные данные копируются в массив байтов A.

 


Связанные темы