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

StackOverflow https://stackoverflow.com/questions/2670429

  •  28-09-2019
  •  | 
  •  

Вопрос

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

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

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

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

Это было полезно?

Решение

Вот идеал:

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);

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

Другие советы

Мы видели эту же проблему в производстве с использованием () оператора, упаковав его.

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

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

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

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

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

Это сработало для меня при использовании .flush () Мне пришлось добавить близко внутри оператора использования.

 using (var imageFile = new FileStream(filePath, FileMode.Create, FileAccess.ReadWrite,FileShare.ReadWrite))
 {
     imageFile.Write(bytes, 0, bytes.Length);
     imageFile.Flush();
     imageFile.Close();
  }

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

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

GC.Collect();

Сразу после закрытия потока. Это сработало для меня.

Я предполагаю, что решения IAN Mercer поставит нить спать, может иметь тот же эффект, давая время GC для освобождения ресурсов.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top