🚀 PAF v1 開発進捗報告(C版完成・Python整理)
PAFのおさらい
zipファイル、便利なんですが──
社内SEとしてサポートをしていると、こんな会話を何度も繰り返します。
- 「あ、それ圧縮された状態で開いてるので、一度解凍してください」
- 「あ、それzipフォルダから直接操作しちゃうとエラーになります」
- 「フリーズしてる?たぶん展開してからドラッグしないと動きません」
このやり取りを繰り返すたび、ふと思いました。
「そもそも、なんでそんなに圧縮してるの?」
- 回線速度:十分に速い
- ストレージ容量:困っていない
- CPU性能:むしろ解凍処理が無駄
そこで生まれたのが、**圧縮しないアーカイブ形式「PAF(Parallel Archive Format)」**です。
PAFとは?
PAFは、圧縮を一切しないことを前提としたアーカイブ形式です。
特徴
- 圧縮しない → 解凍不要、展開高速
- CRC32による整合性チェック
- フォルダ再帰構造に対応
- ウイルススキャンがそのまま通る
- Cで軽量実装、PythonからもCLIで操作可能
-
.pafignore
(除外リスト)やGUI、FUSEマウントなど将来対応予定
今回の進捗と変更点【v1】
✅ 完了したこと
- Cによるアーカイブ処理(作成・展開・一覧・抽出)を完成
-
.pafignore
による再帰的除外パターン処理を実装(fnmatch()
ベース) - Windowsでも動作する統合テスト
test_all.c
を実装 - パストラバーサル防止(
is_safe_path()
)で安全性を強化
🔄 修正・整理したこと
項目 | 内容 |
---|---|
libpaf_core.c の肥大化 |
→ 処理を libpaf_list.c / libpaf_extract.c に分割 |
paf_create() |
→ paf_create_binary() に統一(安全設計) |
Pythonバインディング | → 全削除。再構築予定のためGitHubから除外 |
README.md |
→ Cライブラリのみテスト済みである旨を明記 |
tools/python/ |
→ 今回のコミットで完全に削除済み |
GitHub Actions | → 今後 .dll/.so/.dylib を自動ビルド予定(現在準備中) |
技術スタックと現状
📦 Cライブラリ(libpaf)
構成:
libpaf/
├── libpaf_core.c
├── libpaf_list.c
├── libpaf_extract.c
├── libpaf_exists.c
├── libpaf_extra.c
├── libpaf.h
├── fnmatch.c / fnmatch.h
テスト:
make
./test/test_all
出力:
[ok] paf_create_binary success
[ok] paf_extract_binary success
[ok] paf_list_binary success
...
今後の計画
- ✅ C版の安定運用を継続
- 🛠 GitHub Actions で
.dll/.so/.dylib
自動生成(全OS対応) - 🔁 Python CLI を再設計(
ctypes
再構築 orcffi
検討中) - 📦 PyPI 対応 / GUI展開(Tkinter or PyQt)も予定
- 🌐 ブラウザだけで展開できる WASMビューア も視野に
まとめ
前回の記事で予告していた機能のうち、
Cベースのアーカイブ作成・展開機能はすべて完了しました。
PythonやGUIまわりは一旦整理し、今後の展開に向けて地盤を固めた段階です。
GitHub(最新版)
🔗 https://github.com/mati0516/paf-archive
おまけ:PAFを使ったサンプル処理(C)
const char* inputs[] = {"folder1", "file2.txt"};
paf_create_binary("output.paf", inputs, 2, ".pafignore", 1);
展開:
paf_extract_binary("output.paf", "out_dir", 0);
開発の経緯と想い(note)
この記事は技術的なまとめですが、
なぜPAFを作ったのか?どういう課題意識があったのか?
といった背景を、もう少しストーリー形式で書いたnoteもあります: