Skip to content
← 返回压缩与归档列表
压缩与归档完整实践与解答

压缩与归档:完整实践与解答 ​

需能区分源目录、目标文件和归档成员。固定文件 ZIP 示例依赖 Python 3.11+ 标准库与 zlib,只打包 first.txt、second.txt,拒绝已有输出和符号链接;它不解压外部包。本文另说明恢复前应检查的路径、完整性和资源预算。 示例未在本轮执行;本页完整源码与README列出输入、阅读顺序和预期。

归档 完整创建器 ​

归档完整创建器只把固定输入目录中两个明确文件打入ZIP,拒绝符号链接和已有输出。示例未执行;它不是任意归档解压器,不调用系统压缩命令,README列出成员和恢复边界。

归档 路径穿越练习 ​

题目:成员名../outside.txt应如何处理?

参考答案

拒绝该成员并停止解压计划,不能仅去掉前导../后继续,因为这会改名并可能覆盖其他文件。检查归档前不要向目标写任何数据。

归档 恢复演练 ​

归档恢复演练应在独立空目录核对成员数、摘要和必要元数据。只创建压缩包不等于备份成功,必须保留原件;本例未解压未运行,删除输出ZIP不会触及输入文件。

完整源码、配置与输入 ​

下列文件与仓库同源,包含完整实现和输入;不是运行证明。部分练习只需人工阅读配置,不强制构造模拟器。

input/first.txt ​

text
First fictional archive member.

input/second.txt ​

text
Second fictional archive member.

archive.py ​

python
import sys
import zipfile
from pathlib import Path

def create(source, target):
    names = ("first.txt", "second.txt")
    contents = []
    for name in names:
        path = source / name
        if path.is_symlink() or not path.is_file():
            raise ValueError(f"not a regular input: {name}")
        if path.stat().st_size > 1048576:
            raise ValueError(f"input too large: {name}")
        contents.append((name, path.read_bytes()))
    if target.resolve() in [(source / n).resolve() for n in names]:
        raise ValueError("output cannot replace input")
    with zipfile.ZipFile(target, "x", compression=zipfile.ZIP_DEFLATED) as archive:
        for name, data in contents:
            archive.writestr(name, data)
    print("created ZIP members=2; no extraction performed")

if __name__ == "__main__":
    try:
        if len(sys.argv) != 3:
            raise ValueError("usage: python archive.py INPUT_DIRECTORY NEW_OUTPUT.zip")
        create(Path(sys.argv[1]), Path(sys.argv[2]))
    except (ValueError, OSError, zipfile.BadZipFile) as exc:
        print(str(exc), file=sys.stderr)
        sys.exit(2)

requirements.txt ​

text
# Python 3.11+ standard library with zlib support for ZIP_DEFLATED.
# No external archive tool; no untrusted archive is extracted.

项目README与完整依赖 ​

README提供前置、完整自跑或阅读方式、预期、失败案例与恢复清理。本轮没有执行任何示例、产品CLI、模型或外部API。

markdown
# 压缩与归档:完整教学包

示例未执行。全部输入为教学虚构资料,不能用于真实账号、生产数据或外部系统。

## 前置与依赖

Python3.11以上标准库及zlib,Linux将python改python3;input应为可信独立目录。

## 文件与输入

- `input/first.txt`:本包完整文件。
- `input/second.txt`:本包完整文件。
- `archive.py`:本包完整文件。
- `requirements.txt`:本包完整文件。

## 读者将来自跑或阅读

复制本包所有文件到独立目录,在该目录作为当前工作目录。以下是读者自用资料,本轮禁止执行。

```text
python archive.py input result-new.zip
```

## 正常预期

创建包含first.txt与second.txt的ZIP,输出created ZIP members=2;不解压、不恢复权限。

## 失败案例与恢复

输出已存在则拒绝;输入任一为符号链接或大小超过1MiB则在创建ZIP前拒绝。

## 清理及能力边界

不是不可信ZIP扫描器,不接受外部包;IO失败可留下部分ZIP,人工核对后只删result-new.zip,不动input。

## 来源

- [官方依据](https://docs.python.org/3/library/zipfile.html)(2026-10-17资料核对;不是运行证明)

依据与适用范围 ​

本课完成的是列明任务的理论与静态资料,不代表产品全部能力或三平台运行通过。历史文档保留旧URL;涉及账号、版本、价格与界面位置时,以对应官方资料及实际授权环境为准。

继续阅读