尧图精选

VS Code清理最近文件夹与工作区历史的完整指南

🕒 发布时间:2026/10/2 18:23:08 📁 来源:尧图网络
最近有个朋友问我一个特别实际的问题VS Code 用久了以后一打开就显示一堆之前打开过的文件夹和工作区想清理掉但又不想挨个右键删除尤其有些还是跨项目的路径看着就乱。很多人第一反应是去改 settings.json结果找半天也见不到这些记录到底存哪里。其实 VS Code 的“文件夹和工作区”历史并没有放在普通的用户配置里而是藏在另一个状态数据库文件里。我折腾了一阵子把存储机制和清理方法都摸了一遍下面直接从实际经验出发把这类记录的删除方式讲清楚。如果你只是单纯想把“最近打开过的文件夹和工作区”从 VS Code 里彻底删掉那么这篇就是完整的操作指南。我不仅会告诉你用界面按钮怎么删还会带你把底层的state.vscdb数据库打开手动清除指定条目。全程用真实命令演示同时会告诉你哪一步容易翻车怎么提前做好备份避免把整个编辑器的状态搞坏。1. 项目背景与需求拆解为什么 VS Code 会把文件夹记进“配置文件”1.1 现象描述最近记录删不掉我用 VS Code 很多年最早的时候它会把最近打开的文件夹、工作区和文件列表写在一个叫storage.json的 JSON 文件里。那会儿想清理还比较直白直接删除对应字段就行了。但后来版本更新历史记录迁移到了 SQLite 数据库里也就是state.vscdb很多老教程就失效了。界面上的表现是你在欢迎页或者“文件”菜单里的“最近的文件夹/工作区”能看到一长串路径就算你手动在列表里逐条点击“从最近列表中移除”有时候还是会有残余而且如果你不小心删掉了多个项目想批量清除的时候就会觉得特别麻烦。更让人费解的是大家打开用户设置settings.json里面根本没有所谓的“最近文件夹”字段那它到底存哪其实 VS Code 的配置体系分两层一层是用户可见、可以被settings.json控制的显式配置另一层是编辑器运行时自动生成的工作台状态比如窗口布局、最近打开的文件、文件夹、工作区记录、扩展功能缓存等。后者统一存储在状态服务里而 SQLite 数据库state.vscdb就是最核心的载体。明白了这一点你就不会再去 settings.json 里白找了。1.2 配置存储机制settings.json 不等于状态存储先动手打开你的 VS Code 用户目录。在 Windows 上按Win R输入%APPDATA%\Code\User在 Linux 上是~/.config/Code/UsermacOS 上则对应~/Library/Application Support/Code/User这个目录下面你能看到settings.json、keybindings.json、snippets等文件但“最近打开过的文件夹和工作区”并不在其中。真正干活的目录叫globalStorage就在User目录的下一级。进入之后能看到一个state.vscdb文件它的后缀看起来像旧版 Access 数据库但本质上是 SQLite 格式。VS Code 会在这个数据库里保存大量工作台状态数据常用的键包括键名含义windowState.recentFolders_json最近打开的文件夹列表windowState.recentWorkspaces_json最近打开的工作区列表windowState.lastKnownFiles_json最近打开的文件列表windowState.fullscreen是否全屏windowState.zoomLevel缩放级别所以你想删除的“文件夹和工作区”记录就是上面这两个键对应的 JSON 数组。看到这里方向已经很明确只要操作这个数据库或者通过编辑器自带的清除命令就能实现干净利落的批量删除。1.3 文件夹、工作区、最近记录三者的关系在 VS Code 里“文件夹”和“工作区”是两个不同概念。文件夹指你打开的一个普通项目目录工作区则由一个.code-workspace文件定义可以同时聚合多个文件夹并附带一组独立的配置。默认情况下你每次File Open Folder打开一个目录VS Code 都会在state.vscdb中追加一条历史记录。如果你曾经打开过.code-workspace文件那条记录会被归入工作区列表。两者的存储位置独立但在清理时经常被混在一起。尤其是某些项目同时在最近文件夹列表和最近工作区列表中出现删除时必须分别处理。记住这条原则文件夹记录归recentFolders_json工作区记录归recentWorkspaces_json文件记录归lastKnownFiles_json。2. 数据在哪一目了然定位 VS Code 的全局状态存储2.1 跨平台的用户目录路径既然要动手删数据库第一步肯定要找到它。上面我已经提了User目录其实state.vscdb的完整路径在不同系统上并不完全一致。Windows 下默认是C:\Users\你的用户名\AppData\Roaming\Code\User\globalStorage\state.vscdbmacOS 下是/Users/你的用户名/Library/Application Support/Code/User/globalStorage/state.vscdbLinux 下是/home/你的用户名/.config/Code/User/globalStorage/state.vscdb如果你用的是 VS Code Insider 版路径里对应的文件夹会变成Code - Insiders。另外如果你通过--user-data-dir参数指定了自定义目录那么所有数据都会跑到你指定的目录下路径规则同上。这里有个很重要的经验不要用普通文本编辑器去打开state.vscdb因为它是二进制 SQLite 文件记事本打开全乱码还会让你误以为文件损坏。正确做法是使用 SQLite 工具后面我会具体讲。2.2 state.vscdb 数据库结构打开数据库后你会看到里面默认有一张ItemTable表结构非常简单只有两列key字符串类型保存状态键名。value文本类型保存序列化后的 JSON 或字符串。整个 VS Code 工作台的状态就是一张张“键值对”。这种设计类似浏览器的 localStorage但 VS Code 用了轻量级的 SQLite 来持久化。我们平时在命令面板里看到的“重置状态”“开发人员操作”其实都在操作这张表。要手动查看当前数据库里有哪些键可以在 VS Code 里安装一个 SQLite 扩展或者直接用命令行。这里我更推荐直接用 Python 的sqlite3标准库来操作因为它是全平台自带的不需要额外装客户端只要你机器上有 Python 环境即可。如果你会 Node.js也可以用better-sqlite3但后面我给的示例以 Python 为主够用且直观。2.3 与旧版本 storage.json 的区别很多网上老教程会让你去删storage.json这其实只适用于 VS Code 1.65 之前的旧版本。新版早就把历史记录挪进数据库了。也就是说如果你对着旧版路径一顿找觉得奇怪为什么删了又生成多半是因为你删错了文件。另外storage.json这个文件名在现在的版本里偶尔还会出现在某些远程扩展目录里但跟主程序的工作台状态没有关系删了也不会影响最近列表。所以如果你搜到几十篇教你改storage.json的文章建议先看一眼文章发布时间再决定要不要照做。3. 动手清理三种方案由简到繁3.1 方案一使用命令面板快速清除如果你不想折腾底层数据库VS Code 本身其实提供了清除最近记录的快捷命令。打开命令面板CtrlShiftP输入Clear Recent会看到“清除最近打开的文件”之类的命令执行之后就把最近文件列表清空了。但这个方法有一个局限对不同版本的 VS Code可能没有单独区分“仅清除文件夹”“仅清除工作区”的命令而且它的行为只是清空历史记录数组某些旧版本可能还会残留一些空路径。如果你想逐条删界面上的操作路径是文件菜单 →最近的文件夹→ 鼠标悬停在某一个路径上 → 右键 →从最近列表中移除。这个方法适合只删个别项目。但在实际使用中我遇到过右键菜单不显示“移除”选项的情况多半是主题 UI 兼容问题重载窗口后就正常了。命令面板和右键菜单的好处是不会动数据库结构安全性最高。缺点是不够彻底扩展过的历史记录可能还在。所以下面我会讲更硬核的数据库方案它可以做到完全可控。3.2 方案二手工编辑数据库文件3.2.1 关闭编辑器与备份修改数据库之前切记一条铁律先完全退出 VS Code确保没有残留进程。因为 VS Code 在运行时会持续往state.vscdb里写数据如果数据库被占用你的修改可能写不进去甚至让状态文件产生锁冲突。退出完编辑器再把state.vscdb复制一份到一个安全目录作为备份。比如在 Linux/macOS 终端里cp ~/.config/Code/User/globalStorage/state.vscdb ~/state.vscdb.backup-$(date %s)Windows 上可以直接在文件管理器里复制粘贴或者用命令copy C:\Users\你的用户名\AppData\Roaming\Code\User\globalStorage\state.vscdb C:\Users\你的用户名\Desktop\state.vscdb.backup把所有可能用到的二进制文件都备份好后面怎么修改都不慌。3.2.2 查询历史记录键值用一个简单 Python 脚本先连接数据库并查看哪些键和文件夹/工作区有关。把下面内容保存为inspect_vscode_state.pyimport sqlite3 import os def get_db_path(): if os.name nt: return os.path.join(os.environ[APPDATA], Code, User, globalStorage, state.vscdb) elif sys.platform darwin: return os.path.expanduser(~/Library/Application Support/Code/User/globalStorage/state.vscdb) else: return os.path.expanduser(~/.config/Code/User/globalStorage/state.vscdb) import sys db_path get_db_path() print(f数据库路径{db_path}) conn sqlite3.connect(db_path) cursor conn.cursor() rows cursor.execute(SELECT key, length(value) FROM ItemTable WHERE key LIKE %recent% OR key LIKE %windowState%).fetchall() for r in rows: print(r) conn.close()运行python inspect_vscode_state.py后你会看到类似这样的输出(filepicker.workspaceCacheItem, 382) (windowState.lastKnownFiles_json, 1024) (windowState.recentFolders_json, 512) (windowState.recentWorkspaces_json, 256)其中windowState.recentFolders_json对应文件夹列表windowState.recentWorkspaces_json对应工作区列表。你如果只关注这两个就已经拿到了清理目标。3.2.3 修改/删除特定条目一个稳妥的方式是把value更新为空数组。打开交互式 Pythonpython然后执行import sqlite3 db_path 你的state.vscdb完整路径 conn sqlite3.connect(db_path) cur conn.cursor() cur.execute(UPDATE ItemTable SET value ? WHERE key ?, ([], windowState.recentFolders_json)) cur.execute(UPDATE ItemTable SET value ? WHERE key ?, ([], windowState.recentWorkspaces_json)) conn.commit() conn.close()如果你希望让 VS Code 完全重新初始化这些键也可以执行DELETE FROM ItemTable WHERE key IN (...)效果类似编辑器下次启动时会自动补上空列表。但这里我更推荐用UPDATE的方式保持键存在值只是变成空数组这样对 VS Code 的状态恢复最平滑。只删除某个具体文件夹/工作区也是可行的。比如想从recentFolders_json中移除一个特定路径你需要先读取该字段解析成 Python 列表过滤掉目标路径再写回 JSON 数组。核心代码如下import sqlite3, json def load_value(cur, key): row cur.execute(SELECT value FROM ItemTable WHERE key ?, (key,)).fetchone() if not row: return None return json.loads(row[0]) def save_value(conn, cur, key, value): cur.execute(UPDATE ItemTable SET value ? WHERE key ?, (json.dumps(value), key)) conn.commit() target_path /home/me/old-project folders load_value(cur, windowState.recentFolders_json) or [] folders [f for f in folders if f ! target_path] save_value(conn, cur, windowState.recentFolders_json, folders)注意返回值本身可能是一个字符串而不是数组取决于字段保存的序列化格式。更保险的做法是先print出来看一眼再处理。我见过极个别人的字段里包了一层带引号的字符串导致直接json.loads报错这时候只要多解析一层就能解决。3.3 方案三写脚本批量清理附 Python 代码如果你经常需要清理 VS Code 历史尤其承受多台电脑或多个项目的场景手工操作太累。我建议把上面的代码封装成一个脚本支持所有平台。下面是我实际在用的清理脚本双击或者命令行运行即可#!/usr/bin/env python3 # -*- coding: utf-8 -*- VS Code 最近文件夹/工作区清理工具 功能清空全部最近文件夹与工作区记录 import os import sys import sqlite3 import shutil import datetime def get_vscode_user_dir(): if os.name nt: base os.environ.get(APPDATA, ) return os.path.join(base, Code, User) elif sys.platform darwin: return os.path.expanduser(~/Library/Application Support/Code/User) else: return os.path.expanduser(~/.config/Code/User) def main(): user_dir get_vscode_user_dir() db_path os.path.join(user_dir, globalStorage, state.vscdb) if not os.path.exists(db_path): print(f[错误] 找不到 state.vscdb{db_path}) return 1 # 1. 备份 backup_path db_path .bak- datetime.datetime.now().strftime(%Y%m%d%H%M%S) shutil.copy2(db_path, backup_path) print(f[备份] 已创建 {backup_path}) # 2. 连接数据库执行清空 conn sqlite3.connect(db_path) cur conn.cursor() target_keys [ windowState.recentFolders_json, windowState.recentWorkspaces_json, # 如果你想同时清空最近文件解开下一行 # windowState.lastKnownFiles_json, ] for key in target_keys: cur.execute(UPDATE ItemTable SET value ? WHERE key ?, ([], key)) print(f[清理] {key} 已清空) conn.commit() conn.close() print([完成] 请重新打开 VS Code 验证效果) if __name__ __main__: sys.exit(main())运行前确保 VS Code 已完全退出。脚本会自动备份原始数据库所以你可以在下一次打开 VS Code 之后检查数据是否正常如果不满意直接把备份文件覆盖回去就能还原。整个过程花不了半分钟比手工点命令面板舒服太多。如果你要清理的是state.vscdb里面所有跟历史相关的键包括远程扩展缓存等可以再加一层循环输出所有类似remote和history的键但那样影响范围会扩大我不建议轻易操作。除非你知道某条扩展缓存不可恢复否则只清理官方历史记录键即可。4. 典型问题与避坑清单4.1 清理后重启又恢复有人遇到这种情况明明用命令面板清空了重启 VS Code最近列表里又出现原来的文件夹。原因很可能是 VS Code 没有完全退出后台进程还驻留内存退出时把内存中的旧状态又写回了数据库。我在 Windows 上遇到过多次光点窗口右上角的 X 不够托盘区还有图标甚至任务管理器里还有多个Code.exe。这时候建议在任务管理器里把所有Code.exe进程全部结束或者用系统信号强制退出然后再修改库文件。修改完成后不要急着打开项目先打开一个空白窗口确认历史已经被清空。4.2 误删配置导致扩展状态丢失state.vscdb里不只存最近历史还包含很多编辑器 UI 状态以及某些扩展的状态。比如说你配置过的面板大小、主题选择、按键绑定里的某些临时设置都可能保存在里面。如果你直接把整个state.vscdb文件删除而不只是清空那两个键那么你的一些扩展会出现“重新激活”“丢失登录状态”的情况比如远程开发插件需要重新认证。所以特别强调做任何操作之前先只处理windowState.recentFolders_json和windowState.recentWorkspaces_json这两个键不要碰其他行。这样可以把影响降到最小。4.3 数据库被占用或损坏在 VS Code 还在运行的时候连数据库可能会报database is locked。解决办法是退出进程后稍等几秒让 SQLite 解锁。如果数据库已经损坏SQLite 会报file is not a database这时候需要用备份恢复。所以备份不是可有可无的步骤而是必须做的一步。另外有少数朋友喜欢用 WSL 环境下的 VS Code路径可能在 Linux 子系统的 home 目录下注意你打开的 Windows 文件管理器和 Linux 子系统路径并不互通要用对应的\\wsl$\路径去访问。4.4 只想删除单个文件夹或工作区如果你只想删除某一个特定路径的文件夹手工改recentFolders_json时注意 VS Code 存的路径格式在不同平台有差异Windows 路径通常带盘符且使用反斜杠比如C:\\Users\\me\\projectLinux/macOS 是/home/me/project。过滤时要严格匹配完整字符串否则删不掉。如果你不确定某个路径是以反斜杠还是正斜杠存储可以先执行一次查询把recentFolders_json的 value 内容打印出来看一眼。对于工作区你要删除的是.code-workspace文件的路径而不是工作区内某个子文件夹路径这点很容易搞混。我遇到过最让人头疼的问题是远程 SSH 连接里的历史记录。如果你通过 Remote-SSH 打开过远程机器上的目录这些路径也会被记进本地历史。它们的文件名格式类似vscode-remote://ssh-remote主机名/路径删法其实完全一样只要把对应字符串从recentFolders_json里过滤掉就行。如果你不想要任何远程路径可以用一个简单的规则把包含vscode-remote://的条目全部排除。4.5 别忘了“文件”类型历史看起来标题只问文件夹和工作区但很多时候用户看到“历史记录”里混杂着大量文件路径。如果你也想一并清理“最近打开的文件”那就把windowState.lastKnownFiles_json也加入清理目标。文件历史往往更长实际操作中把它清掉更让人舒心。不过注意这个键里存的可能是比较复杂的对象结构而不只是普通字符串数组所以最好先 JSON 解析后再处理不要想当然直接当数组。4.6 补充一条安全提醒不要在state.vscdb里使用VACUUM或PRAGMA integrity_check之前不做备份。这些操作大都没问题但一旦你环境特殊比如数据库损坏或磁盘写入异常数据可能清不干净。我建议清理历史本来就是低频操作保守一点仅用UPDATE清空特定键最大程度降低风险。修改完成后立刻重新打开 VS Code随便打开一个文件夹确认没有异常弹出。4.7 常见问题速查表问题原因解决方案删了 history 但重启又出现后台进程未退出彻底结束 Code 进程再修改数据库找不到state.vscdb用户目录路径不对确认是否使用 Insider 版或自定义 user-data-dirSQLite 报 database is locked编辑器未完全退出结束所有 Code 进程等待解锁文件夹记录删了工作区记录还在两类历史存储不同分别清空recentFolders_json和recentWorkspaces_json代码报 JSON decode 错误value 可能不是纯数组先打印 value 原值分析格式清理后扩展登录状态丢失误删了扩展相关键用备份覆盖恢复只清空目标键结尾经验分享与后续维护建议我个人用了很久的 VS Code现在基本形成了固定的清理节奏平时用命令面板清最近文件每两个月用脚本把文件夹和工作区历史整体清空一次。这么做的好处是欢迎页不会总展示一堆陈年旧项目也避免不小心在演示时暴露不该让别人看到的路径。清理虽然是个小操作但踩过坑的人都知道直接删文件很容易把自己搞到扩展全部重来的地步。如果只能记住一点那就是只动windowState.recentFolders_json和windowState.recentWorkspaces_json并且一定要先备份state.vscdb。另外如果你管理多台机器可以把前面那段 Python 脚本存到自己的工具库或快捷脚本目录里。以后不管在办公室还是回家只要一键运行VS Code 的最近文件夹和工作区记录都能瞬间重置。这个方法对 VS Code 的稳定版本和 Insider 版本都适用唯一的区别是数据库路径里的“Code”改成“Code - Insiders”脚本里稍微加一行判断即可。实测下来整个清理过程从找到数据库到验证结果最慢也就 5 分钟。只要按文中的备份、清键、重开验证三步走基本不会再被那些拗口的路径困扰。
上一篇/下一篇内容由系统自动关联 返回资讯列表 →