FileStream, чтобы сохранить файл затем сразу разблокировали в.NET?

У меня есть этот код, который сохранил файл PDF.

FileStream fs = new FileStream(SaveLocation, FileMode.Create);
fs.Write(result.DocumentBytes, 0, result.DocumentBytes.Length);
fs.Flush();
fs.Close();

Это хорошо работает. Однако иногда это не выпускает блокировку сразу же, и это вызывает исключения захвата файла с функциями, бежит за этим выполнением.

Есть ли идеальный способ выпустить блокировку файла прямо после фс. Близко ()

9
задан JasonMArcher 2 July 2015 в 23:04
поделиться

4 ответа

Вот идеал:

using (var fs = new FileStream(SaveLocation, FileMode.Create))
{
    fs.Write(result.DocumentBytes, 0, result.DocumentBytes.Length);
}

, который примерно эквивалентен:

FileStream fs =  null;
try
{
    fs = new FileStream(SaveLocation, FileMode.Create);
    fs.Write(result.DocumentBytes, 0, result.DocumentBytes.Length);
}
finally
{
    if (fs != null)
    {
        ((IDisposable)fs).Dispose();
    }
}

с использованием более читабелен.


ОБНОВЛЕНИЕ:

@aron, теперь, когда я думаю,

File.WriteAllBytes(SaveLocation, result.DocumentBytes);

выглядит даже красивее, чем идеал: -)

16
ответ дан 4 December 2019 в 07:47
поделиться

Мы наблюдали ту же проблему в производственной среде с оператором using (), заключившим ее в оболочку.

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

Но даже при исключении всего антивирусного программного обеспечения в системах с очень высокой нагрузкой, где файлы хранятся в общих сетевых папках, мы все равно время от времени сталкивались с проблемой. А, кашель, короткая нить. Сон (), кашель, после закрытия, казалось, вылечил его. Если у кого-то есть лучшее решение, я хотел бы его услышать!

5
ответ дан 4 December 2019 в 07:47
поделиться

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

using (FileStream fs = new FileStream(SaveLocation, FileMode.Create))
{
  fs.Write(result.DocumentBytes, 0, result.DocumentBytes.Length);  
}
3
ответ дан 4 December 2019 в 07:47
поделиться

Если функции, которые выполняются после этой, являются частью одного и того же приложения, то лучшим подходом может быть открытие файла для чтения / записи в начале всего процесса, а затем передача файла каждой функции без закрытия это до конца процесса. Тогда приложению не нужно будет блокировать ожидание завершения операции ввода-вывода.

3
ответ дан 4 December 2019 в 07:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: