深入解析:利用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.