【发布时间】:2026-02-12 20:40:01
【问题描述】:
我正在尝试将文件从 squeak 下载到磁盘。 我的方法适用于小文本/html文件, 但由于缺乏缓冲, 大型二进制文件非常慢 https://mirror.racket-lang.org/installers/6.12/racket-6.12-x86_64-win32.exe。 此外,完成后,文件要大得多(113 MB) 比下载页面上显示的 (75MB)。
我的代码如下所示:
download: anURL
"download a file over HTTP and save it to disk under a name extracted from url."
| ios name |
name := ((anURL findTokens: '/') removeLast findTokens: '?') removeFirst.
ios := FileStream oldFileNamed: name.
ios nextPutAll: ((HTTPClient httpGetDocument: anURL) content).
ios close.
Transcript show: 'done'; cr.
我已经尝试[bytes = stream next bufSize. bytes printTo: ios] 使用[stream atEnd] whileFalse: 循环在HTTP 响应的contentStream 中使用[stream atEnd] whileFalse: 循环来处理固定大小的块,但这会使输出文件在每个块周围加上单引号,并且块之后还有额外的内容,看起来像流的所有字符,每个字符都用单引号引起来。
如何实现将 HTTP 响应缓冲写入磁盘文件? 另外,有没有办法在显示下载进度的同时发出吱吱声?
【问题讨论】:
-
对于大小不匹配,您是否尝试将
#binary发送到FileStream,然后再存储二进制内容? -
@Leandro 我曾想过这样做。但是我没有时间测试它。在我的电脑上开始下载超过五分钟后,吱吱声就冻结了。我也不确定关于代码的其他事情,所以在我学习了如何将 HTTP 响应逐块写入磁盘后,我决定这样做。
标签: http download stream smalltalk squeak