利用DeepSeek编写实现ZSTD压缩解压的v语言程序

v语言的ZSTD模块位于目录vlib/compress/zstd/,它还依赖thirdparty/zstd中的c语言文件。
基于vlib/compress/zstd/目录中的示例测试文件,DeepSeek给出的程序如下:

import os
import compress.zstd
import time

fn main() {
    println("ZSTD 压缩/解压工具")
    println("1. 压缩文件")
    println("2. 解压文件")
    println("3. 退出程序")
    
    choice := os.input("请选择操作 (1-3): ")
    
    match choice {
        "1" { compress_file() }
        "2" { decompress_file() }
        "3" { println("退出程序") }
        else { println("无效选择") }
    }
}

fn compress_file() {
    input_file := os.input("请输入要压缩的文件路径: ")
    if !os.exists(input_file) {
        println("文件不存在: ${input_file}")
        return
    }

    output_file := os.input("请输入压缩后文件保存路径(默认添加.zst后缀): ")
    mut final_output := output_file
    if !final_output.ends_with('.zst') {
        final_output += '.zst'
    }

    println("正在压缩 ${input_file}...")
    start_time := time.now()

    // 读取原始文件内容
    original_data := os.read_bytes(input_file) or {
        println("读取文件失败: ${err}")
        return
    }

    // 压缩数据
    compressed_data := zstd.compress(original_data) or {
        println("压缩失败: ${err}")
        return
    }

    // 写入压缩文件(使用write_bytes而不是write_file)
    os.write_bytes(final_output, compressed_data) or {
        println("写入压缩文件失败: ${err}")
        return
    }

    duration := time.since(start_time).seconds()
    original_size := os.file_size(input_file)
    compressed_size := os.file_size(final_output)
    ratio := f64(compressed_size) / f64(original_size) * 100

    println("压缩完成!")
    println("原始文件: ${input_file} (${original_size} 字节)")
    println("压缩文件: ${final_output} (${compressed_size} 字节)")
    println("压缩率: ${ratio:.2f}%")
    println("耗时: ${duration:.2f} 秒")
}

fn decompress_file() {
    input_file := os.input("请输入要解压的.zst文件路径: ")
    if !os.exists(input_file) {
        println("文件不存在: ${input_file}")
        return
    }
    if !input_file.ends_with('.zst') {
        println("请输入.zst后缀的压缩文件")
        return
    }

    output_file := os.input("请输入解压后文件保存路径: ")
    if os.exists(output_file) {
        overwrite := os.input("文件已存在,是否覆盖? (y/n): ")
        if overwrite.to_lower() != 'y' {
            println("取消解压")
            return
        }
    }

    println("正在解压 ${input_file}...")
    start_time := time.now()

    // 读取压缩文件
    compressed_data := os.read_bytes(input_file) or {
        println("读取压缩文件失败: ${err}")
        return
    }

    // 解压数据
    decompressed_data := zstd.decompress(compressed_data) or {
        println("解压失败: ${err}")
        return
    }

    // 写入解压文件(使用write_bytes而不是write_file)
    os.write_bytes(output_file, decompressed_data) or {
        println("写入解压文件失败: ${err}")
        return
    }

    duration := time.since(start_time).seconds()
    compressed_size := os.file_size(input_file)
    decompressed_size := os.file_size(output_file)

    println("解压完成!")
    println("压缩文件: ${input_file} (${compressed_size} 字节)")
    println("解压文件: ${output_file} (${decompressed_size} 字节)")
    println("耗时: ${duration:.2f} 秒")
}

执行结果

v vzstd.v
./vzstd
ZSTD 压缩/解压工具
1. 压缩文件
2. 解压文件
3. 退出程序
请选择操作 (1-3): 1
请输入要压缩的文件路径: vzstd.v
请输入压缩后文件保存路径(默认添加.zst后缀):
正在压缩 vzstd.v...
压缩完成!
原始文件: vzstd.v (3496 字节)
压缩文件: .zst (1073 字节)
压缩率: 30.69%
耗时: 0.01 秒

./vzstd
ZSTD 压缩/解压工具
1. 压缩文件
2. 解压文件
3. 退出程序
请选择操作 (1-3): 2
请输入要解压的.zst文件路径: .zst
请输入解压后文件保存路径: a.v
正在解压 .zst...
解压完成!
压缩文件: .zst (1073 字节)
解压文件: a.v (3496 字节)
耗时: 0.01 秒
/par#

注意,上述程序不能放在zstd模块所在目录,也不能在文件名中包含test, 否则会编译失败,或者无法执行,后者只能用v test命令执行测试,例如

编译vlib/compress/zlib/中的tzlib.v报错
/par/v# v vlib/compress/zlib/tzlib.v
vlib/compress/zlib/tzlib.v:1:1: builder error: bad module definition: vlib/compress/zlib/tzlib.v imports module "compress.zlib" but /par/v/vlib/compress/zlib/tzlib.v is defined as module `main`
    1 | import zlib //compress.
      | ~~~~~~~~~~~
    2 |
    3 | fn main() {
测试成功
/par/v# v -stats test vlib/compress/zlib/
---- Testing... --------------------------------------------------------------------------------------------------------
        V  source  code size:      30261 lines,     139328 tokens,     819812 bytes,   292 types,    14 modules,   138 files
generated  target  code size:       9975 lines,     343879 bytes
compilation took: 1916.210 ms, compilation speed: 15792 vlines/s, cgen threads: 15
running tests in: /par/v/vlib/compress/zlib/zlib_test.v
      OK       0.051 ms     1 assert  | compress.zlib.test_zlib()
     Summary for running V tests in "zlib_test.v": 1 passed, 1 total. Elapsed time: 0 ms.

 OK    2001.082 ms vlib/compress/zlib/zlib_test.v
------------------------------------------------------------------------------------------------------------------------
Summary for all V _test.v files: 1 passed, 1 total. Elapsed time: 2018 ms, on 1 job. Comptime: 0 ms. Runtime: 2001 ms.

把同样的文件复制到/par目录就能编译运行
/par# v run tzlib.v  
/par# v tzlib.v
可以看到编译后的文件
/par# ls tz*
tzlib  tzlib.v

对于zstd模块
直接运行不报错,但实际上没有编译
/par/v/vlib/compress/zstd# v read_zstd_files_test.v
/par/v/vlib/compress/zstd# ./read_zstd_files_test
bash: ./read_zstd_files_test: No such file or directory
测试成功
/par/v# v -stats test vlib/compress/zstd/read_zstd_files_test.v
---- Testing... --------------------------------------------------------------------------------------------------------
        V  source  code size:      32013 lines,     149578 tokens,     877360 bytes,   316 types,    14 modules,   142 files
generated  target  code size:      10955 lines,     381737 bytes
compilation took: 2410.768 ms, compilation speed: 13279 vlines/s, cgen threads: 15
running tests in: /par/v/vlib/compress/zstd/read_zstd_files_test.v
      OK    [1/3]     2.959 ms     5 asserts | main.test_reading_and_decoding_a_known_zstded_file()
      OK    [2/3]    89.994 ms    20 asserts | main.test_decoding_all_samples_files()
      OK    [3/3]     9.946 ms     3 asserts | main.test_reading_zstd_files_compressed_with_different_compress_level()
     Summary for running V tests in "read_zstd_files_test.v": 28 passed, 28 total. Elapsed time: 102 ms.

 OK    2621.919 ms vlib/compress/zstd/read_zstd_files_test.v
------------------------------------------------------------------------------------------------------------------------
Summary for all V _test.v files: 1 passed, 1 total. Elapsed time: 2638 ms, on 1 job. Comptime: 0 ms. Runtime: 2621 ms.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值