WriteFile vs TransmitFile для больших файлов, которые необходимо удалить с сервера после передачи - PullRequest
5 голосов
/ 02 февраля 2010

Я должен инициировать загрузку больших файлов пользователем в веб-браузер, где я создаю файл для передачи на сервер, а затем немедленно удаляю его. Я нашел достаточно примеров, чтобы увидеть, что я, вероятно, должен использовать Response.TransmitFile или Response.WriteFile ... но слышал, что есть проблемы с обоими:

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

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

Как лучше всего с этим справиться?

Существует также BinaryWrite ... могу ли я перебрать поток файлов, копируя его по сегментам?

Ответы [ 4 ]

4 голосов
/ 02 февраля 2010

Вот хорошее решение, которое использует TransmitFile, но позволяет вам сделать что-то, как только это будет сделано с помощью делегата:

http://improve.dk/blog/2008/03/29/response-transmitfile-close-will-kill-your-application

Просто замените запись в конце на удаление файла.

2 голосов
/ 17 марта 2011

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

Я полагаю, что вы можете отключить буферизацию для WriteFile, установив Response.BufferOutput = false;

Как только для этого параметра установлено значение false, вы сможете вызывать WriteFile без буферизации ...

0 голосов
/ 21 августа 2016

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

 FileStream fs = new FileStream(@"D:\FileDownLoad\DeskTop.zip", FileMode.OpenOrCreate);
        MemoryStream ms = new MemoryStream();
        fs.CopyTo(ms);
        context.Response.AppendHeader("content-disposition", "attachment; filename=" + "DeskTop.zip");
        context.Response.ContentType = "application/octet-stream";
        context.Response.BinaryWrite(ms.ToArray());
        fs.Close();
        File.Delete(@"D:\FileDownLoad\DeskTop.zip");
0 голосов
/ 03 февраля 2010

Не могли бы вы зафиксировать файл на диск (произвольное имя и т. Д.) И начать отправку, но добавить запись в таблицу БД с временным именем файла, после определенного вами периода времени, чтобы какое-то задание очистки прошло через эти записи БД и удалите файл с диска, если он устарел.

...