Как заблокировать файл при записи на него через FileStream?

Я пытаюсь понять, как писать двоичный файл с FileStream и BinaryWriter, и держать файл заблокированным для чтения во время записи. Я специально не хочу, чтобы другие приложения/процессы могли читать с того момента, пока оно написано.

//code to declare ba as a byte array

//dpath is the path to the file

FileStream BinaryFile = new FileStream(dpath, FileMode.Create, FileAccess.Write);

BinaryWriter Writer = new BinaryWriter(BinaryFile);

Writer.Write(ba);

Writer.Close();

BinaryFile.Dispose();

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

Ответ 1

Вы ищете четвертый параметр FileStream Конструктор.

public FileStream(
    string path,
    FileMode mode,
    FileAccess access,
    FileShare share
)

Итак, в вашем случае:

FileStream BinaryFile = new FileStream(dpath, FileMode.Create,
                                       FileAccess.Write, FileShare.None);

FileShare -Enum:

Содержит константы для контроля доступа к другим файлам FileStream объекты могут иметь один и тот же файл.

Пользователи

  • Нет. Сокращает общий доступ к текущему файлу. Любой запрос на открытие файла (этим процессом или другим процессом) завершится с ошибкой, пока файл не будет закрыт.
  • Прочитать. Позволяет продолжить открытие файла для чтения. Если этот флаг не указан, любой запрос на открытие файла для чтения (этим процессом или другим процессом) завершится с ошибкой до тех пор, пока файл не будет закрыт. Однако, даже если этот флаг указан, для доступа к файлу могут потребоваться дополнительные разрешения.
  • Write. Позволяет продолжить открытие файла для записи. Если этот флаг не указан, любой запрос на открытие файла для записи (этим процессом или другим процессом) завершится с ошибкой до тех пор, пока файл не будет закрыт. Однако, даже если этот флаг указан, для доступа к файлу могут потребоваться дополнительные разрешения.
  • ReadWrite. Позволяет продолжить открытие файла для чтения или записи. Если этот флаг не указан, любой запрос на открытие файла для чтения или записи (этим процессом или другим процессом) завершится с ошибкой до тех пор, пока файл не будет закрыт. Однако, даже если этот флаг указан, для доступа к файлу могут потребоваться дополнительные разрешения.
  • Удалить. Позволяет впоследствии удалять файл.
  • Inheritable. Делает дескриптор файла наследуемым дочерними процессами. Это не поддерживается Win32.

Ответ 2

Я не знаю, возможно ли это.

Например, Firefox сохраняет файлы при загрузке с использованием другого имени, пока они не будут завершены. Когда все там, оно переименовывает его в исходное имя. Другой суффикс файла позволит избежать того, что пользователи попытаются открыть его двойным щелчком.