如何在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
相关产品推荐
相关产品推荐

