Размер, который вы хотите, - это размер (а не размер на диске). Размер на диске включает в себя дополнительное место, которое занято, вписываясь в размер блока 4К раздела. Размер - это точное количество бит в файле.
Я не верю, что есть хороший способ сказать, что загрузка была завершена. Response.TransmitFile, вероятно, лучший способ для безопасной отправки файла. Но я не верю, что в нем есть что-то, что скажет вам, действительно ли пользователь получил файл.
Я не знаю о бизнесе, который это поддерживает, но я не могу придумать легитимного бизнеса, в котором пользователи допускали бы одну загрузку для каждой модели покупки, а со стандартностью HTTP-модели запросов / ответов это невозможно. Вы можете сделать точный приемник на стороне клиента. Не говоря уже о том, что эту модель можно легко взломать, отправив ошибочный ответ при получении последнего пакета.
Я думаю, что использую что-то вроде окна загрузки (через 2 часа после покупки) и затем блокирую его на IP после того, как первый запрос достигнет того же результата и приведет к гораздо меньшим проблемам пользователей и звонкам в службу поддержки. Кроме того, если файл не имеет какой-либо строгой DRM, предоставление пользователю постоянного доступа на основе его логина, скорее всего, является подходящей бизнес-моделью, потому что, получив файл, он может скопировать его столько раз, сколько пожелает.
Посмотрите на DVD или Blu-Ray, никакие средства защиты от копирования или контроля доступа не спасут ваши файлы от пиратов, поэтому упростите работу для законных пользователей.