在我的文件管理器中,我需要提供下载文件的功能。我需要能够同时选择单个文件和目录。这可能是一个例子:
/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+ GB),而我所需要关心的只是临时存储,直到存档被删除。
我找不到有关如何执行此操作的任何信息,所以有些事情告诉我,我需要使用标志调用GetListing()方法FtpListOption.Recursive
,然后“手动”创建每个目录,最后调用Download()方法,它返回一个流。
不过,有没有更好的方法?