В моем файловом менеджере мне нужно предложить возможность загрузки файлов. Мне нужно иметь возможность выбирать как отдельные файлы, так и каталоги. Это может быть пример:
/www/index.html
/www/images/
/www/styles.css
Если я выберу эти 3 элемента (2 файла и 1 папка), мне нужно будет добавить их все в ZIP-архив. У меня уже есть рабочий пример, в котором я использую DownloadFolder () и DownloadFile () . Однако это выглядит так:
- Загрузить каждый файл на диск
- Если есть какие-либо папки, рекурсивно просмотрите их и загрузите эти файлы в соответствующие папки (выполняется автоматически)
- Позвоните
System.IO.Compression.ZipFile.CreateFromDirectory()
, чтобы заархивировать загруженные файлы в ZIP-архив - Удалите загруженные файлы из предыдущего
- Потоковое воспроизведение ZIP-файла с помощью
new FileStream(zipFile, FileMode.Open, FileAccess.Read, FileShare.None, 4096, FileOptions.DeleteOnClose)
, чтобы ZIP-файл получил впоследствии удаляется
Это довольно плохо, потому что мне нужно сначала загрузить файлы, добавить их в архив, удалить файлы, которые я только что скачал, передать архив пользователю, а затем, наконец, удалить архив для очистки. Что было бы лучше:
- Сообщите FluentFTP, какие файлы следует передавать
- Создать ZIP-архив НА ДИСКЕ
- Добавить каждый файл и каталог рекурсивно в архив
- Потоковое воспроизведение архива и его последующее удаление
Делая это, я смогу создавать очень и очень большие файлы (100+ ГБ, если это так ), и все, о чем мне нужно будет заботиться, - это временное хранилище до тех пор, пока архив не будет удален.
Я не смог найти никакой информации о том, как это сделать, поэтому что-то подсказывает мне, что мне нужно вызовите метод GetListing () с флагом FtpListOption.Recursive
, затем создайте каждый каталог «вручную» и, наконец, вызовите метод Download () , который возвращает поток.
Есть ли способы получше?