【问题标题】:Where VS Code stores the list of open files?VS Code 在哪里存储打开文件的列表?
【发布时间】:2017-12-28 20:44:32
【问题描述】:

我正在尝试在工作和家中同步 VS Code 实例,包括打开文件的列表。 我知道有同步设置的扩展,但它们不包括 Open Files AFAIK。 我不希望在正在运行的实例下进行实时同步,但如果我重启两台机器并在它们上启动代码,我希望它们相同。

目前,我在 OneDrive 上安装了可移植的 Code,我也尝试将 AppData\Roaming\Code 移动到 OneDrive,用指向此副本的符号链接替换实际目录。

但是,当我在家里打开编辑器时,它有自己的一组打开文件。

我尝试使用 ProcMon 来了解它的来源,我尝试阅读一些来源。似乎询问可能更容易:-)

顺便说一句,我正在我项目的代码 git 文件夹中打开。并且此文件夹在两台 PC 上位于同一路径。

【问题讨论】:

  • 你考虑过 Visual Studio Code 实时分享吗? code.visualstudio.com/blogs/2017/11/15/live-share,看来麻烦少了
  • 我没有尝试过,但我怀疑它是否适合我。例如,如果托管计算机离线怎么办?
  • 在 Linux 上,打开的文件列表可能保存在 $HOME/.config/Code 下的某个位置(该文件夹至少存在于我的 Ubuntu 21.04 笔记本电脑上)。

标签: visual-studio-code


【解决方案1】:

我很确定AppData\Roaming\Code 是有问题的位置是正确的。具体来说:

  • AppData\Roaming\Code\storage.jsonwindowsState 部分。
  • AppData\Roaming\Code\Backups\workspaces.json

在您退出代码(文件 > 退出)之前,这些文件(或至少 storage.json)不会得到更新。如果您在工作机器上打开 Code 并且在使用家用机器时没有看到更改,这可能就是您没有看到预期结果的原因。

Code / Atom 也将状态信息存储在 sqlite3 数据库中,并且其中存储了大量状态信息:

  • AppData\Roaming\Code\Local Storage\file__0.localstorage

使用 SQLite 浏览器工具(例如 http://sqlitebrowser.org/)将其打开。您将在表ItemTable 中看到许多熟悉的路径引用。 value 列显示为“BLOB”(二进制),但您可以单击任何行并将数据导出到文件中。执行此操作并在文本编辑器中打开它(例如代码!:)),您会看到它只是一个 JSON 字符串。

(由于 VS Code 基于 GitHub 的 Atom 编辑器,因此使用“Atom”而不是“Code”搜索问题通常会挖掘到您可能无法找到的信息。)

【讨论】:

  • 感谢file__0.localstorage 是一个 SQLite 文件的提示!这个星期五,我在工作中专门关闭了我的代码,将AppData\Roaming\Code 复制到 OneDrive 并试图让它在家里工作 - 它没有帮助。不过我会做更多的实验......
  • 我记得有关赏金的事,并打算在它到期之前完成我的研究 :) 到目前为止,似乎打开的文件存储在 file__0.localstorage 中。明天我应该做决定性的实验。
  • 那么,我学到了什么。昨天我在家的代码在没有任何打开文件的情况下打开。我打开了两个文件,关闭了编辑器,检查了 file__0.localstorage 现在与 OneDrive 副本不同。再次打开代码 - 与预期相同的两个打开文件。关闭它。重命名 file__0.localstorage 并从 OneDrive 中替换它及其日志文件。再次打开代码 - 没有打开文件。封闭式编辑器。返回重命名file__0.localstorage 回来。打开的代码。还有我的两个打开文件。到目前为止一切顺利。
  • 今天我开始工作,打开代码 - 有打开文件的完整列表,只有几十个。这也是我在家里想要的。关闭编辑器,将AppData\Roaming\Code 复制到 OneDrive。回到家,改名为当前file__0.localstorage。将目录从 OneDrive 复制到本地用户配置文件。打开的代码 - 没有打开的文件。返回重命名file__0.localstorage 返回 - 两个打开的文件。结论 - 确实打开了存储在file__0.localstorage 中的文件,但还有更多。也许一些随机的工作区 id 是不同的或什么的。谢谢你的回答,我会投赞成票,但没有赏金。
  • 代码真的位于 atom 之上吗?我以为他们只是在引擎盖下共享电子。
【解决方案2】:

我完全同意@Jonathan 并想补充一点。

对于这个问题,打开的文件存储在file__0.localstorage 这是一个sqlite文件。我只是写了一些代码来提取打开的文件列表。希望对您有所帮助。

import sqlite3
import pandas as pd
import json

fn = r"C:\Users\HelloWorld\AppData\Roaming\Code\Local Storage\file__0.localstorage"
conn = sqlite3.connect(fn)
df = pd.read_sql("select key, value as _value from ItemTable", conn)
df["v"] = df.pop("_value").map(lambda x: x.decode("utf-16"))

# should be choosen carefully
known_file_opened = "numpy"
known_file_closed = "aws"

df_check = df[
    df.v.str.contains(known_file_opened)
    &(~df.v.str.contains(known_file_closed))
]
assert len(df_check) == 1

js = json.loads(df_check.v.iloc[0])
editors = js["groups"][0]["editors"]
print("Found %d editors" %(len(editors)))

paths = []
for editor in editors:
    js_ = json.loads(editor["value"])
    path = js_["resourceJSON"]["fsPath"]
    paths.append(path)

print("Found opened file list:\n%s" %(paths))

【讨论】:

  • 谢谢你,你能把它扩展到Linux吗?那很好啊!在我的 Ubuntu 21.04 笔记本电脑上,$HOME/.config/Code/Local Storage 中没有 file__0.localstorage
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-11
  • 1970-01-01
  • 2012-04-24
  • 1970-01-01
  • 2019-06-25
  • 2021-04-30
相关资源
最近更新 更多