跳至主要内容

檔案操作

用Claude Code處理檔案最大的感受就是:再也不用記一堆快捷鍵了。以前在VS Code裡,我要開啟檔案先按Ctrl+P,然後輸入檔名,再滾動到需要修改的位置。現在直接說"看一下User.js的login方法"就行了。

這篇文章講清楚Claude Code能怎麼操作檔案,以及我在實際使用中的一些經驗。

讀取檔案

基礎讀取

最簡單直接的就是:

看一下src/App.js

Claude Code會自動找到檔案並顯示內容:

I'll read the App.js file for you.

📄 src/App.js (125 lines)
────────────────────────────────────────
import React from 'react';
import './App.css';

function App() {
return (
<div className="App">
<h1>Hello World</h1>
</div>
);
}

export default App;
────────────────────────────────────────

智慧查詢

記不清檔案完整路徑的時候,直接說你想找什麼就行:

找到所有的配置文件

Claude Code會:

  1. 自動搜尋常見的配置檔案(package.json, .env, config.js等)
  2. 列出找到的檔案
  3. 詢問你想看哪個
我找到了以下配置文件:
1. package.json (项目依赖配置)
2. .env.example (环境变量模板)
3. config/database.js (数据库配置)
4. webpack.config.js (打包配置)

请告诉我你想查看哪个文件?

模糊匹配

只記得部分檔名?沒問題:

找到包含"user"的所有文件

Claude Code會使用模糊匹配找到相關檔案:

找到7个包含"user"的文件:

📁 src/
- models/User.js
- controllers/UserController.js
- routes/userRoutes.js
- middleware/userAuth.js
- views/UserProfile.jsx
- tests/user.test.js
- utils/userHelper.js

檢視檔案片段

對於大檔案,你可以只檢視特定部分:

显示User.js中的login方法

Claude Code會定位到具體方法並顯示:

// User.js - login方法 (第45-68行)
async login(email, password) {
try {
// 查找用户
const user = await this.findByEmail(email);
if (!user) {
throw new Error('用户不存在');
}

// 验证密码
const isValid = await bcrypt.compare(password, user.password);
if (!isValid) {
throw new Error('密码错误');
}

// 生成token
const token = jwt.sign(
{ userId: user.id },
process.env.JWT_SECRET,
{ expiresIn: '7d' }
);

return { user, token };
} catch (error) {
throw error;
}
}

對比傳統方式

傳統IDE:

  1. 在檔案樹裡找到檔案
  2. 雙擊開啟
  3. 滾到想看的位置
  4. 可能要開啟好幾個檔案才能理解上下文

用Claude Code:

解释一下User.js的login方法是怎么工作的

Claude Code會:

  1. 自動讀取相關檔案
  2. 理解程式碼邏輯
  3. 解釋給你聽
  4. 指出潛在問題

編輯檔案

精確編輯

改檔案也不用開啟編輯器:

把User.js的login方法里的token过期时间改成30天

Claude Code會:

I'll update the token expiration time in the login method.

✏️ Editing: src/models/User.js

Changed:
Line 60: { expiresIn: '7d' }
→ { expiresIn: '30d' }

✓ File updated successfully

關鍵優勢:

  • 無需告訴Claude Code具體行號
  • 不需要開啟檔案
  • 自動儲存
  • 可以一次修改多個位置

智慧重構

對於複雜的程式碼改動,Claude Code能理解你的意圖:

把User类的所有console.log改成用logger库记录日志

Claude Code會:

  1. 掃描整個檔案找到所有console.log
  2. 在檔案頂部匯入logger
  3. 把所有console.log替換成logger.info/error等
  4. 保持日誌內容不變
I'll refactor the logging in User.js to use the logger library.

✏️ Editing: src/models/User.js

Changes made:
1. Added import: const logger = require('./utils/logger');
2. Replaced 8 console.log statements:
- Line 23: console.log('User created') → logger.info('User created')
- Line 45: console.log('Login attempt') → logger.info('Login attempt')
- Line 67: console.error('Login failed') → logger.error('Login failed')
... (5 more)

✓ Successfully refactored logging

跨檔案編輯

Claude Code可以同時修改多個相關檔案:

把API的baseURL从http://localhost:3000改为从环境变量读取

Claude Code會:

  1. 找到所有使用baseURL的檔案
  2. 在.env檔案中新增API_BASE_URL
  3. 修改所有檔案使用環境變數
  4. 更新配置讀取邏輯
I'll update the API configuration to use environment variables.

📝 Changes across 4 files:

1. .env.example
+ API_BASE_URL=http://localhost:3000

2. src/config/api.js
- const baseURL = 'http://localhost:3000';
+ const baseURL = process.env.API_BASE_URL || 'http://localhost:3000';

3. src/services/userService.js
- axios.defaults.baseURL = 'http://localhost:3000';
+ axios.defaults.baseURL = config.api.baseURL;

4. README.md
+ Added documentation for API_BASE_URL environment variable

✓ All files updated successfully

保持程式碼風格

Claude Code會自動遵循專案的程式碼風格:

在UserController中添加一个deleteUser方法

Claude Code會:

  • 分析現有方法的編寫風格
  • 保持一致的命名約定
  • 使用相同的錯誤處理模式
  • 遵循相同的註釋風格
// 新添加的方法会自动匹配现有风格
/**
* 删除用户
* @param {string} userId - 用户ID
* @returns {Promise<void>}
* @throws {Error} 用户不存在或删除失败
*/
async deleteUser(userId) {
try {
// 检查用户是否存在
const user = await User.findById(userId);
if (!user) {
throw new Error('用户不存在');
}

// 软删除用户
user.deleted = true;
user.deletedAt = new Date();
await user.save();

logger.info(`User ${userId} deleted successfully`);
} catch (error) {
logger.error('Delete user failed:', error);
throw error;
}
}

建立新檔案

使用建議

Claude Code能建立檔案,但我建議優先編輯現有檔案。只有在真的需要新檔案時才建立。

單檔案建立

创建一个邮件服务文件src/services/emailService.js

Claude Code會:

  1. 檢查目錄是否存在
  2. 建立符合專案規範的檔案
  3. 新增必要的匯入和匯出
// src/services/emailService.js
const nodemailer = require('nodemailer');
const logger = require('../utils/logger');

class EmailService {
constructor() {
this.transporter = nodemailer.createTransport({
host: process.env.SMTP_HOST,
port: process.env.SMTP_PORT,
secure: true,
auth: {
user: process.env.SMTP_USER,
pass: process.env.SMTP_PASS,
},
});
}

/**
* 发送邮件
* @param {Object} options - 邮件选项
* @param {string} options.to - 收件人
* @param {string} options.subject - 主题
* @param {string} options.html - HTML内容
*/
async sendEmail({ to, subject, html }) {
try {
const info = await this.transporter.sendMail({
from: process.env.EMAIL_FROM,
to,
subject,
html,
});

logger.info('Email sent:', info.messageId);
return info;
} catch (error) {
logger.error('Failed to send email:', error);
throw error;
}
}
}

module.exports = new EmailService();

批次建立

建立完整的功能模組:

创建一个完整的Product模块,包括模型、控制器、路由和测试

Claude Code會建立整套檔案:

📁 Creating Product module...

✓ src/models/Product.js (Mongoose model)
✓ src/controllers/ProductController.js (CRUD operations)
✓ src/routes/productRoutes.js (Express routes)
✓ src/tests/product.test.js (Unit tests)

📝 Modified files:
✓ src/routes/index.js (Added product routes)
✓ README.md (Updated API documentation)

All files created successfully!

從模板建立

如果專案中有模板或示例檔案,Claude Code會參考它們:

参考UserController创建一个OrderController

Claude Code會:

  1. 分析UserController的結構
  2. 複製相似的模式
  3. 替換為Order相關的邏輯
  4. 保持一致的程式碼風格

避免重複建立

Claude Code會檢查檔案是否已存在:

创建src/utils/logger.js

如果檔案已存在:

⚠️ Warning: src/utils/logger.js already exists.

Would you like me to:
1. View the existing file
2. Create a new file with a different name
3. Overwrite the existing file (not recommended)
4. Cancel the operation

刪除檔案

安全刪除

Claude Code預設不會刪除檔案,需要明確指示:

删除src/old/deprecated.js文件

Claude Code會先確認:

⚠️ Delete File Warning

You're about to delete:
src/old/deprecated.js (248 lines)

This file is referenced in:
- src/index.js (line 15)

Are you sure you want to delete this file?
This action cannot be undone by Claude Code.

建議使用Git

更安全的做法是透過Git管理刪除:

这个文件已经不需要了,请帮我用Git删除

Claude Code會:

git rm src/old/deprecated.js
git commit -m "Remove deprecated file"

這樣可以:

  • 保留在Git歷史中
  • 隨時可以恢復
  • 有清晰的刪除記錄

清理未使用的檔案

找出项目中没有被引用的文件

Claude Code會分析專案:

📊 Analysis Results

Found 5 files with no imports:

⚠️ Potentially unused:
- src/utils/oldHelper.js (created 6 months ago)
- src/components/OldButton.jsx (last modified 3 months ago)
- tests/old.test.js (no longer in test suite)

✓ Safe to keep (config files):
- .eslintrc.js
- jest.config.js

Would you like me to help review these files before deletion?

批次檔案操作

批次重新命名

把所有的.jsx文件重命名为.tsx

Claude Code會:

  1. 找到所有.jsx檔案
  2. 轉換為TypeScript語法
  3. 重新命名為.tsx
  4. 更新所有匯入語句
🔄 Renaming files to TypeScript...

Found 23 .jsx files:

Converting:
1. src/App.jsx → src/App.tsx ✓
2. src/components/Header.jsx → src/components/Header.tsx ✓
3. src/components/Footer.jsx → src/components/Footer.tsx ✓
... (20 more)

Updating 45 import statements...

✓ All files renamed and imports updated successfully

批次格式化

格式化所有Python文件,使用black格式化工具

Claude Code會:

# 安装black(如果未安装)
pip install black

# 格式化所有Python文件
black src/

# 显示格式化结果
reformatted src/models/user.py
reformatted src/controllers/auth.py
reformatted src/utils/helpers.py

All done! ✨ 🍰 ✨
12 files reformatted, 5 files left unchanged.

批次新增版權宣告

在所有.js文件顶部添加MIT许可证声明

Claude Code會:

  1. 讀取LICENSE檔案
  2. 生成合適的檔案頭註釋
  3. 新增到所有檔案
/**
* Copyright (c) 2024 Your Company
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/

// 原有代码...

批次更新匯入路徑

把所有的相对导入路径改为使用@别名

Claude Code會修改所有檔案:

Before:
import Button from '../../components/Button';
import { api } from '../../../utils/api';

After:
import Button from '@/components/Button';
import { api } from '@/utils/api';

Updated 67 import statements across 23 files.

檔案搜尋和導航

全域性搜尋

在整个项目中搜索"TODO"注释

Claude Code會:

🔍 Searching for "TODO" in project...

Found 12 occurrences in 7 files:

📄 src/controllers/UserController.js
Line 45: // TODO: 添加邮箱验证
Line 89: // TODO: 实现密码重置功能

📄 src/services/paymentService.js
Line 23: // TODO: 接入支付宝
Line 156: // TODO: 添加退款功能

📄 src/utils/cache.js
Line 67: // TODO: 实现Redis缓存

... (4 more files)

Would you like me to:
1. Create GitHub issues for these TODOs
2. Group them by priority
3. Help implement one of them

正規表示式搜尋

找出所有的API端点定义

Claude Code使用正則搜尋:

🔍 Found 28 API endpoints:

GET Routes:
/api/users
/api/users/:id
/api/posts
/api/posts/:id

POST Routes:
/api/auth/login
/api/auth/register
/api/users
/api/posts

PUT Routes:
/api/users/:id
/api/posts/:id

DELETE Routes:
/api/users/:id
/api/posts/:id

查詢函式引用

找出所有调用sendEmail函数的地方

Claude Code會分析依賴:

📊 sendEmail function usage:

Used in 5 files:

1. src/controllers/UserController.js (3 calls)
- Line 67: Registration confirmation
- Line 145: Password reset
- Line 203: Email verification

2. src/controllers/OrderController.js (2 calls)
- Line 89: Order confirmation
- Line 234: Shipping notification

3. src/services/notificationService.js (1 call)
- Line 45: General notification

Total: 6 calls across 3 files

專案結構導航

显示src目录的完整结构

Claude Code會生成樹狀圖:

📁 src/
├── 📁 controllers/
│ ├── UserController.js
│ ├── PostController.js
│ └── OrderController.js
├── 📁 models/
│ ├── User.js
│ ├── Post.js
│ └── Order.js
├── 📁 routes/
│ ├── index.js
│ ├── userRoutes.js
│ ├── postRoutes.js
│ └── orderRoutes.js
├── 📁 services/
│ ├── emailService.js
│ ├── paymentService.js
│ └── notificationService.js
├── 📁 middleware/
│ ├── auth.js
│ ├── errorHandler.js
│ └── validator.js
├── 📁 utils/
│ ├── logger.js
│ ├── cache.js
│ └── helpers.js
└── app.js

Total: 7 directories, 19 files

處理大檔案

分段檢視

對於超過1000行的大檔案:

查看database.js中的连接池配置部分

Claude Code會:

  1. 快速定位到相關部分
  2. 只顯示必要的程式碼
  3. 提供上下文資訊
📄 database.js (2,456 lines)
Showing: Connection Pool Configuration (lines 145-203)

────────────────────────────────────────
// 连接池配置
const poolConfig = {
min: 2,
max: 10,
acquire: 30000,
idle: 10000,
};

const sequelize = new Sequelize(
process.env.DB_NAME,
process.env.DB_USER,
process.env.DB_PASS,
{
host: process.env.DB_HOST,
dialect: 'postgres',
pool: poolConfig,
logging: false,
}
);
────────────────────────────────────────

Context: This is part of the database initialization module.
Other sections:
- Schema definitions (lines 1-100)
- Migration setup (lines 250-450)
- Query helpers (lines 500-800)

效能最佳化建議

處理大檔案時的技巧:

1. 使用具體的查詢

❌ 不好:

显示整个config.js文件

✅ 好:

显示config.js中的数据库配置部分

2. 利用檔案片段

显示App.js的前50行
显示App.js的第100-200行
显示App.js的最后100行

3. 按功能模組檢視

显示User.js中所有的静态方法
显示UserController中所有的CRUD方法

大檔案編輯

即使是大檔案,Claude Code也能精確編輯:

在这个2000行的文件中,找到calculateDiscount函数并优化性能

Claude Code會:

  1. 快速定位函式
  2. 分析效能瓶頸
  3. 提供最佳化方案
  4. 精確修改
Found calculateDiscount function at line 1,456

🔍 Performance Analysis:
- Issue 1: Unnecessary loop (line 1,467)
- Issue 2: Repeated database queries (line 1,489)
- Issue 3: Inefficient sorting (line 1,501)

✏️ Applying optimizations...

Optimized version:
- Replaced loop with reduce() - 60% faster
- Added query batching - 80% faster
- Used built-in sort method - 40% faster

Overall improvement: ~70% performance gain

✓ File updated successfully

檔案備份和恢復

使用Git進行備份

Claude Code強烈建議配合Git使用:

我要开始重构代码了,先帮我提交当前的更改

Claude Code會:

git add .
git commit -m "Backup before refactoring

保存当前工作状态,准备开始重构代码"

✓ Committed successfully
✓ You can now safely proceed with refactoring

檢視檔案歷史

显示User.js的修改历史

Claude Code會呼叫Git:

git log --oneline --follow src/models/User.js
📜 File History: src/models/User.js

a3b2c1d (2 hours ago) Add email validation
f9e8d7c (1 day ago) Refactor login method
c6b5a4f (3 days ago) Add password hashing
...

Would you like me to:
1. Show detailed changes in any commit
2. Compare with a previous version
3. Restore to a previous version

恢復檔案

如果改壞了:

把User.js恢复到上一次提交的版本

Claude Code會:

git checkout HEAD -- src/models/User.js
✓ Restored User.js to last committed version
⚠️ All uncommitted changes in this file have been discarded

建立快照

在重大更改前:

我要对整个项目进行大改,先创建一个标签作为备份点

Claude Code會:

git tag -a v1.0-before-refactor -m "Snapshot before major refactoring"
git push origin v1.0-before-refactor
✓ Created tag: v1.0-before-refactor
✓ Pushed to remote repository

You can restore to this point anytime using:
git checkout v1.0-before-refactor

實際應用場景

場景1: 程式碼審查

任務: 審查同事提交的程式碼

查看最近一次提交修改了哪些文件,并帮我审查代码质量

Claude Code會:

  1. 列出所有修改的檔案
  2. 逐一分析程式碼質量
  3. 指出潛在問題
  4. 提供改進建議
📊 Code Review for commit a3b2c1d

Modified files: 4

1. src/controllers/UserController.js
✓ Good: Added input validation
⚠️ Issue: Missing error handling in deleteUser()
💡 Suggestion: Add try-catch block

2. src/models/User.js
✓ Good: Added unique constraint
✓ Good: Updated timestamp fields

3. tests/user.test.js
✓ Good: Added test cases for new validation
⚠️ Issue: Missing test for edge cases
💡 Suggestion: Add test for null email

4. README.md
✓ Good: Updated API documentation

Overall: 8/10
Main concerns: Error handling and test coverage

場景2: 快速原型開發

任務: 30分鐘內建立一個部落格API原型

创建一个简单的博客API,包括:
1. Post模型(标题、内容、作者)
2. CRUD操作
3. 基础的Express路由
4. 简单的测试

Claude Code會快速建立完整結構:

🚀 Creating Blog API prototype...

Step 1: Setting up project structure ✓
- Created src/ directory
- Created models/ controllers/ routes/ tests/

Step 2: Creating Post model ✓
- src/models/Post.js (Mongoose schema)

Step 3: Implementing CRUD operations ✓
- src/controllers/PostController.js

Step 4: Setting up routes ✓
- src/routes/postRoutes.js
- src/routes/index.js

Step 5: Writing tests ✓
- tests/post.test.js (8 test cases)

Step 6: Creating entry point ✓
- src/app.js (Express setup)

✨ Blog API prototype ready!

Quick start:
npm install
npm run dev

API endpoints:
GET /api/posts
GET /api/posts/:id
POST /api/posts
PUT /api/posts/:id
DELETE /api/posts/:id

Time taken: ~2 minutes

場景3: 技術債務清理

任務: 清理專案中的技術債務

帮我找出项目中所有需要改进的地方,包括:
1. 未使用的依赖
2. 过时的代码
3. 缺少的测试
4. 代码重复

Claude Code會進行全面分析:

🔍 Technical Debt Analysis

1️⃣ Unused Dependencies (package.json)
- moment (last used 6 months ago, use date-fns instead)
- lodash (90% unused, import specific functions)
- request (deprecated, use axios)

Savings: ~500KB bundle size

2️⃣ Deprecated Code Patterns
- src/utils/api.js: Using callbacks (update to async/await)
- src/models/*.js: Using var (update to const/let)
- tests/*.js: Using assert (migrate to jest expect)

Files affected: 12

3️⃣ Missing Tests
- src/services/paymentService.js (0% coverage)
- src/controllers/OrderController.js (45% coverage)
- src/utils/validators.js (30% coverage)

Target: 80% coverage

4️⃣ Code Duplication
- User/Post/Order controllers share 80% common code
- Suggestion: Create base controller class

Estimated effort: 2 hours
Lines saved: ~300

Would you like me to start fixing these issues?

場景4: 遷移專案

任務: 從JavaScript遷移到TypeScript

帮我把这个项目从JavaScript迁移到TypeScript

Claude Code會系統地處理:

🔄 JavaScript → TypeScript Migration

Phase 1: Configuration ✓
✓ Created tsconfig.json
✓ Updated package.json dependencies
✓ Created type definitions folder

Phase 2: Converting files (47 files)
✓ src/models/User.js → User.ts
✓ src/models/Post.js → Post.ts
... (converting)

Phase 3: Adding type annotations
✓ Analyzing inferred types
✓ Adding explicit types where needed
✓ Creating interface definitions

Phase 4: Fixing type errors (23 errors)
✓ Fixed implicit any types
✓ Added null checks
✓ Resolved import issues

Phase 5: Updating imports
✓ Updated all import statements
✓ Fixed path aliases

Phase 6: Verification
✓ Type checking passed
✓ Tests still passing

Migration complete! ✨
- 47 files converted
- 23 type errors fixed
- 0 runtime errors
- 100% tests passing

最佳實踐總結

✅ DO - 推薦做法

  1. 配合Git使用

    • 重要修改前先提交
    • 使用分支進行實驗性修改
    • 定期備份到遠端倉庫
  2. 明確表達意圖

    • 說清楚要修改什麼
    • 指明檔案路徑(如果知道)
    • 描述期望的結果
  3. 善用批次操作

    • 一次性處理相似的修改
    • 使用模式匹配
    • 讓Claude Code處理重複工作
  4. 驗證結果

    • 執行測試確保修改正確
    • 檢查程式碼格式
    • 確認符合預期
  5. 保持專案整潔

    • 及時刪除無用檔案
    • 定期清理依賴
    • 維護清晰的專案結構

❌ DON'T - 避免做法

  1. 不要過度建立檔案

    • 優先編輯現有檔案
    • 避免檔案碎片化
    • 保持專案結構簡潔
  2. 不要忽略警告

    • 認真對待Claude Code的警告
    • 刪除檔案前仔細確認
    • 處理潛在的依賴問題
  3. 不要一次改太多

    • 分步驟進行大的修改
    • 每次改動後驗證
    • 保持變更可追蹤
  4. 不要跳過備份

    • 重要修改前務必提交
    • 不要依賴"撤銷"功能
    • 定期推送到遠端
  5. 不要盲目信任

    • 始終驗證生成的程式碼
    • 檢查安全性問題
    • 確保符合專案規範

常見問題

Q: Claude Code會覆蓋我的檔案嗎?

A: 只在你明確要求時才會。Claude Code會:

  • 編輯時顯示具體修改內容
  • 建立新檔案前檢查是否存在
  • 刪除檔案前要求確認

Q: 如何撤銷Claude Code的修改?

A: 三種方法:

# 方法1: Git撤销单个文件
git checkout -- filename

# 方法2: Git撤销所有更改
git reset --hard

# 方法3: Git回到之前的提交
git reset --hard <commit-hash>

Q: 可以一次修改多少個檔案?

A: 理論上沒有限制,但建議:

  • 相關的修改可以批次處理
  • 單次不超過20-30個檔案
  • 複雜修改分多輪進行

Q: 大檔案操作會很慢嗎?

A: 不會。Claude Code最佳化了大檔案處理:

  • 只讀取需要的部分
  • 智慧快取常用檔案
  • 並行處理多個檔案

Q: 如何防止誤刪檔案?

A: 最佳實踐:

  1. 使用Git版本控制
  2. 定期提交更改
  3. 刪除前Claude Code會確認
  4. 重要檔案設定Git保護

進階技巧

技巧1: 使用檔案模式

把所有test目录下的文件移动到tests目录

Claude Code會智慧處理路徑:

  • 自動建立目標目錄
  • 保持目錄結構
  • 更新所有引用

技巧2: 條件篩選

找出所有超过300行但没有测试文件的源文件

Claude Code會組合多個條件:

  • 分析檔案大小
  • 檢查對應的測試檔案
  • 生成待處理列表

技巧3: 智慧重構

把所有内联的配置提取到config/目录

Claude Code會:

  • 識別散落的配置
  • 建立統一的配置檔案
  • 更新所有引用
  • 保持功能不變

技巧4: 檔案依賴分析

分析User.js被哪些文件依赖,如果删除会影响什么?

Claude Code會提供詳細報告:

📊 Dependency Analysis: User.js

Direct dependencies (8):
- src/controllers/UserController.js
- src/routes/userRoutes.js
- src/middleware/auth.js
... (5 more)

Indirect dependencies (15):
- src/app.js (via routes)
- tests/integration/api.test.js (via controller)
... (13 more)

⚠️ Impact of deletion:
- Will break 8 files immediately
- Will affect 15 files indirectly
- 34 test cases will fail

Recommendation: Do NOT delete
Alternative: Deprecate gradually

總結

檔案操作是Claude Code最基礎的功能,但也是最能體現優勢的地方:

核心優勢:

  • 不用記快捷鍵: 直接說就行,不用記各種命令
  • 理解意圖: 不需要精確描述,說大概意思就行
  • 批次處理: 重複任務一次搞定
  • 配合Git: 改之前提醒你,改完幫你提交

使用建議:

  1. 說明白你要改什麼
  2. 配合Git用,改之前先commit
  3. 複雜任務分步做
  4. 改完檢查一下
  5. 及時清理沒用的檔案

用熟了這些操作,開發效率會明顯提升。把時間花在業務邏輯上,而不是檔案管理這些瑣事。

下一步