1. 事故现场C盘刷红的那天下午我盯上了openCode的快照目录先说结论如果你在Windows上把openCode当作日常编码助手用了一段时间发现C盘从80GB可用一路掉到个位数而且系统缓存、IDE索引、Docker镜像全都清过一遍还是没好转那大概率是openCode的快照机制在后台疯狂写临时文件。这个坑我踩过而且是踩到C盘直接爆红、IDE都开始卡顿才反应过来。openCode本身是个跑在终端里的AI编码助手和Claude Code、Codex CLI这类工具定位类似你给它一个任务它自己读代码、跑命令、改文件。听起来很爽但问题恰恰出在改文件这一步。为了保证每一步操作都能回溯、能回滚openCode会在执行修改前把涉及的文件保存一份快照。这个设计本身没问题所有带自动改写文件能力的工具都有但openCode的快照默认落在系统临时目录而且清理策略非常佛系。组合起来的结果就是每跑一次长时间会话C盘都会多出一堆几十MB到几百MB不等的快照碎片日积月累C盘自然就爆了。这篇文章我会完整复述一遍我从C盘满了到抓到元凶再到彻底根治的全过程包括哪些目录可以放心删、哪些千万别碰、怎么把快照迁移到其他盘、怎么用脚本定时止损。如果你正在用openCode或者正准备用建议把这篇存下来。尤其是刚装完openCode、打算把它当主力工具的人等C盘爆了再处理就晚了。2. 快照机制拆解一个后悔药功能是怎么变成硬盘杀手的想要根治问题先得搞清楚openCode到底往硬盘里写了什么。这个部分我按快照是什么、存在哪、为什么越积越多三条线讲。2.1 openCode的快照到底在干什么openCode的快照简单理解就是每次修改文件前的备份。当你让它修一个bug它会先读取文件当前内容执行修改然后告诉你我改了哪些地方。快照就是在读取和修改之间抓取的那一份原始文件副本。好处很明显改坏了可以rollbackAI多次尝试的逻辑混乱时可以回到某个中间状态。这相当于给每一次AI操作都加了后悔药。坏处也很明显AI编码助手的一次长会话可能要改十几个甚至几十个文件每个文件在多次尝试中会被反复修改每次修改前都会产生一份快照。文件小还好一旦项目里有大的资源文件、配置文件、生成的JSON结构一份快照动辄就是几十MB。我在一个偏中型的项目里跑完一个半小时的会话快照目录从几百MB涨到了6GB这个速度是相当吓人的。2.2 临时文件默认落在哪里根据openCode在不同平台上的默认行为它会把运行时数据、会话记录和快照存放在用户目录下的隐藏文件夹里。Windows上通常是这样几个位置路径大致用途C:\Users\用户名\AppData\Local\Temp\opencode*临时文件、运行中产生的快照碎片C:\Users\用户名\.cache\opencode\缓存、快照、会话索引C:\Users\用户名\.local\share\opencode\项目级数据、全局状态存储项目目录下的.opencode\当前项目专属的会话与快照记录每个版本的具体路径可能有差异但大方向不会变默认全都在C盘。你用Windows默认账户名那大概率就是C:\Users\你的名字下面那一堆点开头的文件夹。我那次排查的时候光.cache\opencode一个目录就吃掉了将近18GB里面密密麻麻全是按时间戳和会话ID命名的子目录。每个子目录里是某次会话的快照文件有的文件名直接带hash字符串有的带.bak或.json后缀。看到那个场面C盘爆满的答案基本就不用再猜了。2.3 为什么快照会越积越多三个原因第一个原因是每次修改都存。openCode为了保证你随时能回滚到任意步骤理论上会把每一步都记录下来。这个逻辑在短会话里没问题但如果一次会话持续几小时、涉及几十次文件修改快照数量就是线性增长。第二个原因是旧快照清理策略太弱。openCode虽然有清理机制但默认触发条件往往是会话结束、空间不足或者手动执行清理命令时才会真正释放。如果你习惯挂着终端让openCode长时间运行或者openCode进程被异常终止蓝屏、断电、强杀进程那清理动作根本没有机会执行直白说就是一堆孤儿快照留在盘里。第三个原因是异常退出后无回收机制。进程被强杀快照目录里那些写到一半的临时文件就成了死数据。系统不会知道哪些文件是没用的它们就一直躺在C盘里。我见过一个用户案例三次openCode崩溃之后.cache\opencode里留下了将近2万个文件单文件虽然不大但架不住数量多TEMP目录的文件数量直接拖慢了系统文件索引。3. 顺着C盘一路排查我是怎么把openCode从嫌疑人变成实锤的如果你现在也面临着C盘告急别急着删。先按我的思路走一遍排查确认元凶之后再动手避免误删项目数据或者系统文件。3.1 第一步先看C盘到底被谁吃了在Windows上打开PowerShell跑一下这个命令看整体剩余空间Get-PSDrive C | Select-Object Used, Free如果Free只剩几个GB接着用WizTree或者SpaceSniffer这种磁盘空间分析工具扫一下C盘。这类工具的好处是能按目录树列出每个文件夹的实际占用大小一眼就能看到大头在哪。我当时扫出来的结果很典型Users\用户名\AppData\Local\Temp占了7GBUsers\用户名\.cache占了18GBUsers\用户名\.local占了5GB。整个用户目录加起来超过35GB而这些文件夹平时根本不会出现在普通清理软件的推荐列表里。3.2 第二步识别哪些是openCode相关目录磁盘分析工具只告诉你哪个目录大不会告诉你是谁写进去的。这时候需要到可疑目录里翻一翻。我建议重点检查这几个地方C:\Users\用户名\AppData\Local\Temp C:\Users\用户名\.cache\opencode C:\Users\用户名\.local\share\opencode打开.cache\opencode如果你的目录结构和我的类似会看到一堆以时间戳或UUID命名的子目录。点进去里面有session相关的JSON文件、log文件、以及名为snapshot或者snapshots的子目录这个子目录里通常就是大量原始文件副本。判断依据有三个一是文件名里带snapshot字样二是文件修改时间和你跑openCode的时间段吻合三是文件内容看起来像项目源码或配置文件的副本而不是系统文件。注意如果AppData\Local\Temp里能看到以opencode或tmp-opencode开头的目录那基本就是运行中的快照临时落点。正常情况下这些目录应该在进程退出后被清理但进程崩溃或者强制关闭时不会回收。这类目录你几乎可以断定是openCode制造的。3.3 第三步确认openCode进程是否正在占用删除前必须确认当前没有openCode实例在运行否则文件被占用删不掉还可能边删边写。用PowerShell查一下进程Get-Process | Where-Object { $_.ProcessName -like *opencode* } | Format-Table ProcessName, Id, Path如果列出来有结果先正常退出你的终端会话再用下面命令强制结束残留进程Stop-Process -Name *opencode* -Force -ErrorAction SilentlyContinue注意强杀进程本身又会产生新的临时文件残留所以能正常退出就正常退出这一步只是兜底。3.4 第四步用文件统计快速验证元凶身份如果你不想用可视化工具直接在PowerShell里统计可疑目录的文件数量和总大小$path C:\Users\$env:USERNAME\.cache\opencode Get-ChildItem -Path $path -Recurse -File -ErrorAction SilentlyContinue | Measure-Object -Property Length -Sum输出里的Count和Sum会告诉你文件数量和总字节数。我当时测出来文件数超过一万五千个总大小18GB这已经不是可疑而是实锤了。顺便再统计一下快照子目录Get-ChildItem -Path $path -Recurse -Directory -Filter *snapshot* -ErrorAction SilentlyContinue | ForEach-Object { $size (Get-ChildItem $_.FullName -Recurse -File | Measure-Object Length -Sum).Sum; [PSCustomObject]{ Path $_.FullName; SizeMB [math]::Round($size / 1MB, 2) } }这样能看出哪些快照目录是大头后面清理的时候也更有针对性。4. 清理实操如何安全地把快照临时文件从C盘请出去确认元凶之后接下来就是动手清理。这一节我给的是我自己验证过、也推荐给朋友的流程按顺序做基本不会误删有用的东西。4.1 清理前的最后一道保险备份快照元数据这里有一个很多人会忽略的点openCode的快照除了文件副本本身还有一套索引记录负责告诉你哪次操作对应哪份快照。如果你把快照目录整个删了历史rollback能力会失效但项目源码本身不受影响。所以如果你对某个项目还想要保留回滚能力最好先把快照索引文件备份一下路径通常在.cache\opencode下的session或project目录里。备份方式很简单把需要保留的目录复制到D盘或移动硬盘Copy-Item -Path C:\Users\$env:USERNAME\.cache\opencode -Destination D:\opencode_backup -Recurse -Force备份完之后正题开始。4.2 删除步骤从大目录到小目录一层层来首先删除确定无害的快照和缓存目录$opencodeCache C:\Users\$env:USERNAME\.cache\opencode $opencodeShared C:\Users\$env:USERNAME\.local\share\opencode if (Test-Path $opencodeCache) { Remove-Item $opencodeCache -Recurse -Force } if (Test-Path $opencodeShared) { Remove-Item $opencodeShared -Recurse -Force }然后清理系统临时目录里的opencode残留$tempRoot C:\Users\$env:USERNAME\AppData\Local\Temp Get-ChildItem -Path $tempRoot -Directory -ErrorAction SilentlyContinue | Where-Object { $_.Name -like *opencode* } | Remove-Item -Recurse -Force -ErrorAction SilentlyContinue最后如果你的项目目录下开着.opencode文件夹确认它只是会话快照和临时产物再删Get-ChildItem -Path D:\your_projects -Directory -Filter .opencode -Recurse -ErrorAction SilentlyContinue | ForEach-Object { Write-Host 找到项目快照目录: $($_.FullName) }注意项目目录下的.opencode里可能有些配置是你手动改过的删除前多看一眼只删太大且没有自定义配置的项目即可。我自己遇到的是纯自动生成的快照全删了。如果你项目目录下有.opencode但不确定内容先打开看看有没有settings.json之类的自定义配置有的话只删子目录里的snapshot部分别整目录都动。4.3 清理系统临时目录里所有残留可选但推荐既然C盘已经红了说明整个系统的临时文件都处于失控边缘。顺手把Windows临时目录彻底清一遍Get-ChildItem -Path C:\Windows\Temp -Recurse -Force -ErrorAction SilentlyContinue | Remove-Item -Recurse -Force -ErrorAction SilentlyContinue这条命令会清掉大量系统级临时文件。遇到报错别慌多半是某几个文件被占用跳过即可。跑完之后再用开头的Get-PSDrive C看一下空间Get-PSDrive C | Select-Object Used, Free我那次清理完C盘从剩余不足5GB直接恢复到47GB可用效果立竿见影。到这里C盘爆满这个症状已经解决但如果不做后面的根治措施快照还会继续写回来两三个月后又是一个循环。4.4 清理之后要不要重启建议重启一次。因为很多被openCode占用过的DLL或进程句柄只有重启后才会真正释放。重启之后再跑一次磁盘检查确认空间没有回弹。如果发现C盘可用空间又少了几个GB说明有某个后台进程仍在写那就回头仔细检查是不是有多个openCode实例在你不知道的情况下跑着。5. 根治方案让openCode的快照永远不再霸占C盘清理是一次性的根治才是关键。下面几个方案我建议组合使用从把快照挪走到限制快照总量再到自动止损三层防护。5.1 方案一把系统临时目录和缓存目录迁移到D盘最直接的办法是修改Windows的用户环境变量把TEMP和TMP指到D盘。这样openCode以及绝大多数程序产生的临时文件都会写到D盘C盘压力骤减。操作步骤按Win R输入sysdm.cpl打开系统属性点环境变量在用户变量里选中TEMP、TMP分别改成D:\Temp新建D:\Temp目录确保D盘空间充足点确定后重启电脑或注销再登录生效。注意修改TEMP变量后旧C盘临时目录里没有被清理的残留不会自动搬过去需要手动删我一般直接沿用第4节的清理命令。还有一个细节有些老程序不认用户级TEMP、只认系统级TEMP如果你发现某个程序异常可以再把系统级TEMP也改过去但系统级改名要格外小心部分系统服务会有点脾气。5.2 方案二用环境变量把openCode的缓存目录指向D盘openCode本身也支持通过环境变量指定数据存放路径具体变量名在不同版本里略有不同常见的是XDG_CACHE_HOME和XDG_DATA_HOME。在Windows上可以这么设置[Environment]::SetEnvironmentVariable(XDG_CACHE_HOME, D:\opencode\cache, User) [Environment]::SetEnvironmentVariable(XDG_DATA_HOME, D:\opencode\data, User)设置完成后重启终端再启动openCode验证一下确认.cache和.local下面的数据确实不再出现在C盘。如果你用的版本不认这两个变量也可以去openCode的配置文件里手动指定缓存路径。提示改完环境变量后旧C盘上的缓存目录不会被自动删除需要自己手动清一次。避免同一份数据在C盘和D盘各存一份既占空间又造成混淆。5.3 方案三定期清理脚本 Windows任务计划程序环境变量只解决新快照写到哪的问题已经产生的快照依然需要定期清理。我写了一个简单的PowerShell脚本挂在Windows任务计划程序里每天执行一次超过了指定天数或指定大小的快照会自动删除。核心脚本如下$cachePath D:\opencode\cache $maxAgeDays 7 $maxSizeMB 2048 if (Test-Path $cachePath) { Get-ChildItem -Path $cachePath -Recurse -Directory -ErrorAction SilentlyContinue | Where-Object { (Get-Item $_.FullName).LastWriteTime -lt (Get-Date).AddDays(-$maxAgeDays) } | Remove-Item -Recurse -Force -ErrorAction SilentlyContinue $size (Get-ChildItem -Path $cachePath -Recurse -File -ErrorAction SilentlyContinue | Measure-Object -Property Length -Sum).Sum if ($size -gt ($maxSizeMB * 1MB)) { Get-ChildItem -Path $cachePath -Recurse -File -ErrorAction SilentlyContinue | Sort-Object LastWriteTime | Select-Object -First 500 | Remove-Item -Force -ErrorAction SilentlyContinue } }这个脚本的逻辑是先删掉超过7天没动的快照目录然后如果目录总大小超过2GB就继续删最早的文件直到低于阈值。把它保存成clean-opencode-snapshot.ps1然后在任务计划程序里新建一个每日触发器任务操作为powershell.exe -ExecutionPolicy Bypass -File D:\scripts\clean-opencode-snapshot.ps1就完成了自动化。这个脚本我实测跑了两个月C盘剩余空间一直稳定在60GB以上再也没出现过一夜回到解放前的情况。5.4 方案四控制openCode使用习惯从源头减量最后一条可能有点反直觉减少快照量的最好方式是减少openCode对文件的大规模无差别修改。我在实际使用中观察到当你一次给它一个宏大的任务比如重构整个模块它可能会在多个文件之间反复试错快照数量会爆炸式增长。但如果拆成小任务一个文件一个文件地让它改快照量会小很多。另外openCode原始会话结束后尽早主动退出再开新会话而不是让它长时间挂在一个会话里不断累积。新会话会重新建立快照索引旧会话的中间状态不会延续占用空间。如果你的项目本身很大尽量在项目目录下配置忽略列表让openCode不要扫描那些不需要快照的大目录比如node_modules、dist、build这些目录一旦被快照覆盖体积会非常可观。6. 避坑清单这些常规操作千万别做清理和根治方案说完了最后把我踩过坑总结成一份清单每条都是真实教训。6.1 别在openCode运行的时候直接删目录我第一次清理时终端里openCode还挂着直接删了.cache\opencode结果不到十分钟新的快照目录又生成了而且因为索引丢失会话状态全部乱掉。正确的姿势一定是先退出所有openCode实例确认没有相关进程再动手删。如果嫌麻烦至少也要先停掉当前任务再清理。6.2 别用磁盘清理代替手动清理Windows自带的磁盘清理和存储感知能清掉一部分临时文件但对%USERPROFILE%\.cache\opencode这种隐藏目录基本无效。我之前一直以为磁盘清理足够直到发现空间还是越来越少才意识到这类工具根本不会扫到用户目录下以点开头的深层目录。用第三方清理软件也一样很多所谓C盘瘦身专家清理范围有限而且个别还会误删系统文件风险不低。6.3 别把系统级TEMP和用户级TEMP混为一谈修改环境变量时很多人只改了用户级TEMP忽略了系统级。Windows下有些服务以SYSTEM权限运行只认系统级临时目录。如果你发现改完之后C盘空间还是继续减少去检查系统级TEMP是不是还指向C盘。不过系统级TEMP不建议轻易改到D盘某些Windows更新流程对路径有硬编码改了容易出幺蛾子。我的建议是用户级TEMP一定改系统级TEMP保持默认但定期手动清理C:\Windows\Temp这样平衡。6.4 别贪图省事把整个用户目录剪切到D盘网上有很多教程教人把Users文件夹整个搬走这个操作风险极大涉及一堆系统权限和注册表关联问题。更安全的做法是把用户目录里那些较大的缓存子目录单独挪走比如.cache、.local、.npm、.gradle等而不是整锅端。给openCode设置XDG_CACHE_HOME和XDG_DATA_HOME来定向存放就是单独搬的典型操作比剪切整个用户目录可靠得多。6.5 别只清理不监控清理完就算了等于没根治。我最后多做了两步一步是用任务计划程序跑定期清理脚本另一步是在C盘剩余空间低于10GB时弹窗提醒。可以用一条很简单的PowerShell配合任务计划实现$drive Get-PSDrive C $freeGB [math]::Round($drive.Free / 1GB, 2) if ($freeGB -lt 10) { Write-Host C盘剩余空间不足 $freeGB GB请检查opencode快照目录 }把这段代码挂到开机启动或者每天定时任务里空间告急时至少能听到个响声不至于等电脑卡死了才发现问题。最后分享一个我现在的固定流程处理完这次事故之后我把openCode的使用流程固化成了一套标准动作每次重要会话开始前确认XDG_CACHE_HOME和XDG_DATA_HOME指向D盘每次长会话结束后手动跑一次清理脚本顺手看一眼C盘剩余空间每周末检查一次快照目录大小超过2GB就直接清掉。这套流程跑了半年再也没出现C盘爆红的状况。如果你已经因为openCode的快照吃过亏别觉得是自己操作有问题——这工具的默认行为就是这样快照机制本身是好功能只是默认存储位置和清理策略确实不太贴心。把存储重定向加上定期清理这工具还是很好用的。希望这篇排查记录能帮你少走点弯路别等到C盘红了才开始翻目录。