fix: 还原 cmd /c type 读取并移除路径字符黑名单 — 加密钻带文件只能用 cmd type 读取

b75439c 以"命令行是多余的"为由把读取改成 FileStream+StreamReader,是错误前提:
项目存在无法用标准文件 I/O 读取的加密 txt/钻带文件(CLAUDE.md "Encrypted file reading"、
Docs/readme.md "读取加密钻带(使用cmd命令type读取)"、
Docs/刀具列表拖动排序功能说明.md "加密文件:使用 cmd 命令读取"均有记录),
该改动会导致这些文件读取失败。本次回退。

改动:
- 还原 CommandTypeFileReader.cs:cmd.exe /d /c type(ANSI/936 解码),
  失败时退出码与 stderr 保留在异常消息里
- 删除 ForbiddenPathChars 与两处字符校验(本次报错根因):
  ( ) & ^ @ 空格在双引号内对 type 安全,黑名单只会误伤 (D2-f)、(1) 等正常文件名
- 保留"非空路径""文件存在"校验与 ReadAllText(path, encoding) 重载
- 删除 AnsiFileReader.cs,15 处调用点改回
- CLAUDE.md / .trellis/spec/:恢复"加密文件必须用 cmd type"的说明,
  并标注为不可优化掉的硬约束(含 b75439c 反例)

验证:demo_drl 全部 36 个文件与 2335894 实现逐字符一致、行数一致;
含 ( ) & 空格路径实测可读(旧黑名单实现抛"文件路径包含不允许的命令行特殊字符");
cmd 失败消息含退出码与 stderr;dotnet build -p:Platform=x86 0 错误,
警告集与 HEAD 基线完全一致。
This commit is contained in:
2026-09-20 13:28:37 +08:00
parent b75439cff4
commit 209268ee18
11 changed files with 168 additions and 143 deletions

View File

@@ -60,7 +60,7 @@ Supported file extensions: `.txt`, `.drl`, `.dr2`, `.dpin`
## Important Technical Details
- **File encoding**: ANSI/GB2312 (code page 936) — drill tape files use this encoding, not UTF-8
- **File reading**: Drill tape / parameter files are read through `AnsiFileReader` (direct `FileStream` + `StreamReader` with ANSI/936 as the default encoding, BOM detection kept as before), never through a command line. Paths containing `(`, `)`, `&`, `%`, `!`, `^`, `@` or spaces read fine. The old `cmd.exe /c type` reader was removed on 2026-09-20 — there is no encryption layer (verified: all `demo_drl/` samples decode identically via plain file I/O).
- **Encrypted file reading**: Uses `cmd.exe /c type` to read drill tape files (some files are "encrypted" and cannot be read directly via standard file I/O). Drill tape / parameter files are read through `CommandTypeFileReader` — **do not "optimize" this into standard file I/O (`File.ReadAllText` / `FileStream` / `StreamReader`)**: that was tried in `b75439c` (2026-09-20) and broke reading of encrypted files, and was reverted. Paths are no longer filtered by a character blacklist: `(`, `)`, `&`, `^`, `@` and spaces are safe inside the quoted `type` argument, and the old blacklist only produced false positives on normal file names such as `(D2-f)` and `(1)`.
- **Slot hole calculation**: Uses CAM350 standard tolerance (0.0127mm) for computing hole counts along slot paths
- **Backup strategy**: Creates `.bak` files when saving modified drill tape data
- **Command-line support**: App accepts a file path argument to auto-load a drill tape file on startup