file-operations.mdx 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. ---
  2. title: "文件操作工具 - AI 如何安全读写代码"
  3. description: "解析 Claude Code 的文件操作工具设计:FileRead、FileEdit、FileWrite 三大工具的职责划分、安全策略和实现细节。"
  4. keywords: ["文件操作", "FileRead", "FileEdit", "FileWrite", "代码编辑"]
  5. ---
  6. {/* 本章目标:介绍文件类工具的设计理念 */}
  7. ## 读、写、改——三种操作模式
  8. Claude Code 把文件操作拆分为三个独立工具,而不是一个万能的"文件工具":
  9. | 工具 | 功能 | 设计考量 |
  10. |------|------|---------|
  11. | **Read** | 读取文件内容 | 只读操作,权限最低,AI 可以随意使用 |
  12. | **Write** | 创建新文件或完全重写 | 高风险操作,需要确认 |
  13. | **Edit** | 精确替换文件中的特定片段 | 中等风险,但比 Write 安全——只改你指定的部分 |
  14. <Tip>
  15. 为什么 Edit 和 Write 要分开?因为"编辑一行"和"重写整个文件"的风险完全不同。分离后,权限系统可以对它们施加不同的控制策略。
  16. </Tip>
  17. ## 文件读取的智慧
  18. Read 工具不是简单的 `cat` 命令,它有很多精细的设计:
  19. - **分页读取**:超大文件不会一次性全部读入,支持 offset + limit 指定范围
  20. - **多格式支持**:除了文本文件,还能读取图片(多模态展示)、PDF、Jupyter Notebook
  21. - **文件状态缓存**:记住已读过的文件内容,避免重复读取浪费 token
  22. - **Token 感知**:文件内容计入 token 预算,系统会自动评估是否"读得起"
  23. ## 精确编辑 vs 全量重写
  24. Edit 工具的核心设计是**精确字符串替换**:
  25. - AI 指定 `old_string`(要被替换的原文)和 `new_string`(替换后的新文)
  26. - 系统确保 `old_string` 在文件中**唯一匹配**——如果匹配到多处或零处,操作失败
  27. - 这个设计确保 AI 不会"改错地方"
  28. ## 搜索与导航
  29. 在动手修改之前,AI 通常需要先"找到目标"。两个搜索工具分工明确:
  30. - **Glob**:按文件名模式搜索("找到所有 `.ts` 文件"),替代 `find` 命令
  31. - **Grep**:按文件内容搜索("找到所有包含 `TODO` 的行"),替代 `grep/rg` 命令
  32. 两者都经过优化,能在大型项目中快速返回结果,并自动截断过长的输出。
  33. ## 文件历史快照
  34. 每当 AI 准备修改文件时,系统会自动保存一份快照。这意味着:
  35. - 用户可以随时回滚到 AI 修改前的状态
  36. - 即使 AI 做了错误的编辑,原始内容不会丢失
  37. - 快照与 git 互补——git 追踪已提交的变更,快照保护未提交的工作