Как я могу заблокировать файл во время записи в него через FileStream? - PullRequest
10 голосов
/ 10 ноября 2009

Я пытаюсь выяснить, как записать двоичный файл с 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 есть метод блокировки, но он блокирует запись, а не чтение, так что это мне не поможет.

Ответы [ 2 ]

23 голосов
/ 10 ноября 2009

Вы ищете четвертый параметр 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 могут иметь к тому же файлу.

Члены:

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...