库
以下内容摘自官方的 Working with multiple Vaults 文档:
在 Obsidian 中每个笔记集合都是一个库。库中包含一个目录,以及目录下的所有子目录。
当您的插件可以像其他任何 Node.js 应用一样访问文件系统时,Vault
模块旨在使在库中操作文件以及目录变得更加简单。
以下示例中递归打印了库中所有 Markdown 文件的路径:
ts
const files = this.app.vault.getMarkdownFiles()
for (let i = 0; i < files.length; i++) {
console.log(files[i].path);
}
TIP
如果您想列出 所有 文件,而且不仅仅只是 Markdown 文档,可以使用 getFiles()
方法来代替。
读取文件
有两个方法可以用来读取文件内容: read()
以及 cachedRead()
。
- 如果您仅仅只想将内容展示给用户, 可以使用
cachedRead()
方法以避免多次从磁盘中读取文件。 - 如果您想读取文件内容,并在改变它之后写回磁盘,可以使用
read()
方法以避免文件可能会被之前的内容所覆盖。
区别
cachedRead()
方法以及 read()
方法两者之间的唯一区别体现在插件即将读取文件,而文件在 Obsidian 外被修改了的时候。一经文件系统通知 Obsidian 文件在外部被修改, cachedRead()
方法表现的 完全 就像 read()
方法一样。同样的,如果您在 Obsidian 内容保存了文件,那么读取缓存也会被刷新。
以下示例读取了库中的所有 Markdown 文件内容,并且返回了文档大小的均值:
ts
import { Notice, Plugin } from "obsidian";
export default class ExamplePlugin extends Plugin {
async onload() {
this.addRibbonIcon("info", "Calculate average file length", async () => {
const fileLength = await this.averageFileLength();
new Notice(`The average file length is ${fileLength} characters.`);
});
}
async averageFileLength(): Promise<number> {
const { vault } = this.app;
const fileContents: string[] = await Promise.all(
vault.getMarkdownFiles().map((file) => vault.cachedRead(file))
);
let totalLength = 0;
fileContents.forEach((content) => {
totalLength += content.length;
});
return totalLength / fileContents.length;
}
}
删除文件
有两个方法可以用来删除文件, 分别是delete()
, 以及 trash()
。使用哪个方法取决于您是否允许用户改变主意(找回文件)。
- 使用
delete()
方法会彻底删除文件。 - 使用
trash()
方法会将文件移入回收站。
当您使用 trash()
方法时, 您可以设置将文件移入系统的回收站,也可以设置将删除的文件移动至用户的库根目录下的 .trash
本地文件夹中。
文件还是文件夹?
一些操作返回或者接收一个 TAbstractFile
对象, 它既可以是一个文件,也可以是一个文件夹。在您使用它之前需要确认 TAbstractFile
的类型到底是什么。
ts
const folderOrFile = this.app.vault.getAbstractFileByPath("folderOrFile");
if (folderOrFile instanceof TFile) {
console.log("It's a file!");
} else if (folderOrFile instanceof TFolder) {
console.log("It's a folder!");
}