Visoffile VS TransmitFile для больших файлов, которые необходимо удалить с сервера после передачи

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

Вопрос

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

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

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

Какой лучший способ иметь дело с этим?

Также есть бинарнорит ... Могу ли я закрутить поток файлов, копируя его в сегменты?

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

Решение

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

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

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

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

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

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

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

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

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

 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");
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top