Skip to main content

Module pack

Module pack 

Source
Expand description

把一个目录打包成容器载荷。

§为什么这一层在 core 而不在各前端里

CLI 早先自己实现了这套遍历逻辑,GUI 要做文件夹加密时面临选择: 复制一份,还是提上来共享。复制的代价不是多写几行,而是两份实现 迟早分歧——比如哪天给 CLI 修了「跳过符号链接」的处理,GUI 那份 还在按老样子打包,用户在两个入口得到不同的容器。

core 里已经有 crate::fsatomic 在做文件系统操作,所以放这里 与既有边界一致。

§为什么不用 walkdir

core 的依赖目前只有密码学与格式相关的几个 crate,保持这份克制是 有价值的:它让 core 能被任意项目复用,也让审计面更小。 目录遍历用 std::fs 手写一个显式栈就够了,不值得为此引入新依赖。

手写还有个额外好处:递归深度可控。walkdir 默认无限深, 遇到深层嵌套目录时 CLI 那份实现是靠运气不炸;这里显式设了上限。

§顺序必须稳定

条目按路径排序后写入。这不是美观问题——索引里记的是每个文件在 载荷中的区间,遍历顺序变了,同一个目录两次打包会得到不同的 布局。稳定顺序让「同样的输入产出同样的容器」成立,便于校验。

Structs§

PackPlan
流式打包的计划:遍历一遍目录,只取大小,不读内容。
PackReader
把规划里的文件内容按顺序串成一条 Read 流,并逐文件计算哈希。
PackedFolder
打包结果。
SkippedEntry
打包过程中跳过的条目。
WalkItem
遍历时交给回调的一个条目。

Enums§

SkipReason
跳过原因。

Constants§

MAX_DEPTH
目录递归深度上限。

Functions§

pack_folder
把 root 目录打包成容器载荷。
plan_folder
规划流式打包。遍历判定与 pack_folder 共用 walk_dir。
walk_dir
遍历目录树,对每个条目调用 visit。

Type Aliases§

ProgressFn
遍历时可选的进度回调。