Потоковая передача файлов прямо в новый ZIP-архив для экономии памяти с помощью FluentFTP - PullRequest
0 голосов
/ 18 июня 2020

В моем файловом менеджере мне нужно предложить возможность загрузки файлов. Мне нужно иметь возможность выбирать как отдельные файлы, так и каталоги. Это может быть пример:

/www/index.html
/www/images/
/www/styles.css

Если я выберу эти 3 элемента (2 файла и 1 папка), мне нужно будет добавить их все в ZIP-архив. У меня уже есть рабочий пример, в котором я использую DownloadFolder () и DownloadFile () . Однако это выглядит так:

  1. Загрузить каждый файл на диск
  2. Если есть какие-либо папки, рекурсивно просмотрите их и загрузите эти файлы в соответствующие папки (выполняется автоматически)
  3. Позвоните System.IO.Compression.ZipFile.CreateFromDirectory(), чтобы заархивировать загруженные файлы в ZIP-архив
  4. Удалите загруженные файлы из предыдущего
  5. Потоковое воспроизведение ZIP-файла с помощью new FileStream(zipFile, FileMode.Open, FileAccess.Read, FileShare.None, 4096, FileOptions.DeleteOnClose), чтобы ZIP-файл получил впоследствии удаляется

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

  1. Сообщите FluentFTP, какие файлы следует передавать
  2. Создать ZIP-архив НА ДИСКЕ
  3. Добавить каждый файл и каталог рекурсивно в архив
  4. Потоковое воспроизведение архива и его последующее удаление

Делая это, я смогу создавать очень и очень большие файлы (100+ ГБ, если это так ), и все, о чем мне нужно будет заботиться, - это временное хранилище до тех пор, пока архив не будет удален.

Я не смог найти никакой информации о том, как это сделать, поэтому что-то подсказывает мне, что мне нужно вызовите метод GetListing () с флагом FtpListOption.Recursive, затем создайте каждый каталог «вручную» и, наконец, вызовите метод Download () , который возвращает поток.

Есть ли способы получше?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...