You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Guile中以原生方式下载文件?(Guix环境)

使用Guile原生API实现文件下载与SHA256校验

你可以利用Guile自带的(web client)模块实现原生HTTP下载,无需调用外部的wget;同时用(gcrypt hash)模块原生计算SHA256哈希,替代sha256sum命令。以下是完整的原生实现代码:

(use-modules (ice-9 binary-ports)
             (ice-9 format)
             (web client)
             (web response)
             (gcrypt hash))

;; 原生文件下载函数
(define (download-file url output-path)
  (let* ((response (http-get url))
         (input-port (response-port response))
         (output-port (open-file output-path "wb"))) ; 二进制写入模式
    (copy-port input-port output-port)
    (close-port output-port)
    (close-port input-port)
    (if (eq? (response-code response) 200)
        (begin
          (display "Download successful.\n")
          #t)
        (begin
          (format #t "Download failed with HTTP code: ~a\n" (response-code response))
          #f))))

;; 原生SHA256计算函数
(define (calculate-sha256 filename)
  (call-with-input-file filename
    (lambda (port)
      (bytevector->string (sha256 port) 16)))) ; 转十六进制字符串

;; 调用示例
(if (download-file "https://download.qemu.org/qemu-9.2.0.tar.xz" "qemu-9.2.0.tar.xz")
    (let ((sha256sum (calculate-sha256 "qemu-9.2.0.tar.xz")))
      (format #t "SHA256: ~a~%" sha256sum))
    (display "Skipping SHA256 check since download failed.\n"))

关键细节说明

  • 下载部分:

    • http-get发起HTTP请求并返回响应对象,response-port获取包含下载数据的输入端口
    • 用open-file的"wb"模式打开输出文件,确保二进制数据正确写入(避免文本模式的编码问题)
    • copy-port高效完成端口间的数据复制,无需手动读取写入
    • 通过response-code判断HTTP请求是否成功(200表示成功)
  • SHA256校验部分:

    • call-with-input-file自动处理文件端口的打开与关闭,避免资源泄漏
    • sha256函数直接从文件端口计算哈希,返回字节向量,再通过bytevector->string转成十六进制字符串(第二个参数16指定十六进制编码)

内容的提问来源于stack exchange,提问作者Rainb

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 07:47:19