功能 测量数据 内存 下载 使用指南 开发者 支持 登录 开始使用
DEVELOPERS

开发者文档

这是写给要在 FastFind 之上做点什么的人的文档。只是想使用的话,请看 使用指南 中就有。

开始使用

可以用 FastFind 做什么?

FastFind 在自己电脑里的一个小型搜索服务器可以启动起来。这样其他程序就能获取搜索结果。

从 0.81 起,网页访问默认关闭。 需要在 设置 → 网页访问 中打开,下面的 REST API 才会开启。也有不打开就能连接的方法 — 命名管道 中有详细说明。

  • 在 PowerShell、Python 脚本中获取文件列表
  • 为自己的启动器或工具加上搜索
  • 在结果右键菜单中 加入自己的功能(插件)

索引只存在于您的电脑内,不会外传。服务器也只在 127.0.0.1 上响应。

服务器运行在哪里?

默认是 9090。可以在设置中更改。

不过必须打开网页访问才会开启。 关闭时,即使程序在运行,那个端口也不存在 — 因为根本不会创建监听套接字。

重复文件也能通过 API 查找吗?

可以。直接放进 q 即可 — 与在搜索框中输入的语法相同。

GET /api/search?q=dupe:내용 ext:jpg
GET /api/search?q=dupe: path:D:\사진
GET /api/search?q=empty:

结果会 相同的排在一起。分组顺序始终一致,因此同一查询发两次也不会打乱顺序。

dupe:内容 会实际读取文件,因此比其他查询更慢。若候选超过 2 万个,就不再比较内容,而是在 error 中返回提示 — 因为不能以为结果就是全部而去删除。

http://127.0.0.1:9090

程序未运行时服务器也不存在。先用 /api/status 确认更安全。

这里有一个实际这样做出来的例子
MyStart 用 FastFind 做的

在浏览器起始页 直接查找自己电脑上的文件。 网页搜索与本地文件在同一处呈现。

浏览器起始页
输入搜索词
MyStart 代理/v1/localfiles
仅中继读取
FastFind127.0.0.1:9090
/api/search

浏览器不会直接调用 FastFind。 若网页界面暴露了 API, 任何站点都能抓取您的文件列表,因此由可信的代理居中, 只传递读取
调用前先用 /api/status 确认是否在运行,若不在则返回 503 fastfind_not_running 并引导至安装说明。 用户只需 安装并运行 FastFind — 无需登录,也无需配置。

访问 mystart.youngsam.net ↗

认证

需要令牌

不能让任何人都能抓取您的文件列表,因此没有令牌就不会响应。

请用以下两种方式之一发送。

Authorization: Bearer <令牌>放在请求头中发送
ff_local_token=<令牌>以 Cookie 发送(从浏览器调用时)

令牌可在 /login 页面获取。只有这两个地址无需令牌即可打开。

POST /api/local-auth/login

REST API

搜索 — GET /api/search
curl -H "Authorization: Bearer $TOKEN" \
  "http://127.0.0.1:9090/api/search?q=견적서%20ext:pdf&max=50"

要发送的内容

q搜索词。完全沿用 使用指南中的搜索语法ext: size: path:、韩文声母 …)
max最多返回多少(省略则用默认值)
name_onlytrue 只搜文件名,false 搜完整路径
case区分大小写
word按整词
regex使用正则表达式
sort asc排序字段与方向
raw只按您输入的原文查找。 关闭对韩语词的猜测 — 请看下面

布尔值 1 0 true false on off yes no 都可以。不写值的 &raw 也视为开启。

ext: 用法

ext:jpg,png用逗号分隔多个 — 请用这种写法
ext:jpg|png不支持。 jpg|png 会被当作一个扩展名,结果为 0 条
ext:jpg ext:png写两次时 只有后面的 会保留

⚠ 从程序调用时请加上 raw=1

默认情况下会把一些词 会按人的习惯来理解。 这对人很方便,但程序调用时 查询会在无预警下被改变,因此结果看起来不对。

不过,只发送一个词时不会猜测类型。 q=photo 会查找文件名含 photo 的文件。下表在 词有两个或以上时(例如: photo 찾아줘)时适用。

photo image 이미지 사진 그림→ 全部图片扩展名(词本身会消失)
doc document 문서→ 全部文档扩展名
audio music 음악 오디오→ 全部音频扩展名
video 동영상 영화 영상→ 全部视频扩展名
엑셀 xls,xlsx,csv
작은 대용량→ 大小条件
10개 상위5→ 数量限制
按大小 최신순 가나다순→ 排序
文件夹 파일만→ 按类型筛选
GET /api/search?q=photo             → 이름에 photo 가 든 파일 (낱말 하나 — 짐작 안 함)
GET /api/search?q=photo 찾아줘      → 이미지 파일 전부 (낱말 둘 — 짐작함)
GET /api/search?q=photo 찾아줘&raw=1 → 이름에 photo 가 든 파일

ext: path: size: 等语法 raw=1 开启后仍然有效。 因为那不是猜测,而是您写下的原样。关闭的只有猜测。

我们的理解结果会包含在响应中。

"interpreted": {
  "keyword": null,                 // 실제로 찾은 낱말 (짐작으로 사라지면 null)
  "extensions": ["jpg","png", …],  // 걸린 확장자
  "guessed": true,                 // ← 참이면 짐작이 낱말을 삼킨 것입니다
  "guessed_words": ["photo"],      // 무엇 때문에 바뀌었는지
  "raw": false
}

guessed trueraw=1 重新调用即可 可以。

返回的内容

{
  "results": [
    {
      "name": "견적서_한빛건설.pdf",
      "path": "C:\\작업\\2026\\견적서_한빛건설.pdf",
      "size": 284915,
      "ext": "pdf",
      "modified": 1786012800,
      "is_dir": false
    }
  ],
  "total": 12,
  "time_ms": 5.3,
  "query": "견적서 ext:pdf"
}

total符合条件的总数results 是其中返回的部分。modified 是自 1970 年起的秒数。

状态 — GET /api/status

查看索引是否就绪、包含多少条目。发送搜索前先确认这个,就能区分程序未运行还是仍在建立索引。

{
  "indexed_files": 4663246,
  "version": "0.86.0",
  "status": "ready"
}

响应中还会带有 engineengine_genmem 等字段,但那是 我们排查问题时使用的值,会不经通知就变更。请勿依赖。

自动补全 — GET /api/suggest

获取输入过程中要显示的候选项。只返回一个字符串数组。

GET /api/suggest?q=견적

["견적서_한빛건설.pdf", "견적서_양식.hwp", "견적_2026.xlsx"]
PowerShell 简短示例
$t = "여기에 토큰"
$r = Invoke-RestMethod -Uri "http://127.0.0.1:9090/api/search?q=ext:log" `
     -Headers @{ Authorization = "Bearer $t" }
$r.results | Select-Object name, path, size | Format-Table
Python 简短示例
import requests, urllib.parse

TOKEN = "여기에 토큰"
q = urllib.parse.quote("견적서 ext:pdf")
r = requests.get(f"http://127.0.0.1:9090/api/search?q={q}&max=20",
                 headers={"Authorization": f"Bearer {TOKEN}"})
for f in r.json()["results"]:
    print(f["size"], f["path"])
其他接口 — 存在,但不作承诺

以下接口也是开放的。但它们是 为我们自己的网页界面而做的,会不经通知就变更。若要使用,请 明白它们可能失效

GET /api/recent最近创建或修改的文件
GET /api/open?path=…打开该文件
GET /api/open-folder?path=…打开该文件所在的文件夹
GET /api/preview?path=…预览图(以图片返回)
GET /api/analysis哪些地方占用空间多
GET /api/browse?path=…文件夹内的列表
/api/favorites /add /remove收藏
/api/smart-folders /add /remove /search已保存的搜索
/api/history /clear搜索记录

如果其中有您常用的,请 告诉我们。我们会优先把有人使用的移入承诺清单。

失败时
连接被拒绝网页访问已关闭(默认)。或者程序未运行,或端口不同
401令牌缺失或错误
404不存在的路径

程序会在用户关闭时一并消失, 如果不开启网页访问,它根本就不会启动。 请不要认为它总是在运行。调用之前, /api/status 确认,若不可用则静默跳过,这样更安全。

如果不想让用户「在设置中打开」, 命名管道 ,请使用它。与网页访问无关,始终可用。

如何知道端口?

默认是 9090,但用户可在设置中更改。若要发布工具,请 让端口可询问或可配置

也可以从设置文件中读取。

%LOCALAPPDATA%\FastFind\settings.json
版本号在哪里

/api/status 里面。 /api/version · /api/health · /api/info没有(404).

要判断某功能是否可用时,请查看 /api/statusversion

有些位置不会出现在结果中

默认有 不收录的文件夹。它们是临时文件和系统文件夹,收录只会让结果变乱、索引变大。

系统$Recycle.Bin · System Volume Information · Recovery
WindowsWindows\WinSxS · Installer · servicing · Temp · Prefetch · SoftwareDistribution
安装残留$WINDOWS.~BT · $WINDOWS.~WS · ProgramData\Microsoft
用户AppData\Local\Temp · .cache · node_modules · .git · __pycache__

这些扩展名 tmp · temp · bak · old · lnk · url 也不收录。

用户可以在 设置 → 索引范围 中修改这个列表,因此每台电脑可能不同。

通过管道连接

不开启网页访问也能连接的方法

从 0.81 起,网页访问默认关闭。因此要使用 REST API,就得请用户自己去打开这项设置,而这并不是一个好开口的请求。

请不要写 命名管道是存在的。与网页访问无关, 始终是开着的,,不会开启端口。

\\.\pipe\FastFind

在管道之上 之类的 REST 路由器原样叠在上面。所以路径、参数、响应都与上面说明的完全相同。 改变的只是通道 — 只要把 HTTP 请求写入管道并读取响应即可。

如何调用

在 Windows 上,管道 就像普通文件一样 打开即可。不需要特殊的库。

GET /api/search?q=견적서 HTTP/1.1
Host: 127.0.0.1
Connection: close

Host必须是数字地址。若填写名称则会被拒绝(这是为了防止 DNS 重绑定)。如果是修改值的请求, Sec-Fetch-Site: same-origin 也请一并加上。只读请求不需要。

Connection: close,请不要遗漏。 如果没有它,连接会一直保持,想读到最后的一方会永远等待。它表现为「卡住」而不是「不可用」,因此很难发现。

需要重试的两种错误

管道是一个实例对应一个连接。我们会预先打开多个,但请求集中时可能会短暂不够用。

231 ERROR_PIPE_BUSY已经满了。稍后再
2 ERROR_FILE_NOT_FOUND就是移交的那一瞬间。 这个也需要重试

2 常被理解为「不存在」而就此放弃,但 在这里表示「请稍等」的情况居多。两种情况都请稍作间隔重试几次(每次 10ms、共五次就够了)。若仍然 2 一直出现,那才是真的“没有 FastFind”。

谁可以连接

仅限当前登录这台电脑的用户 才能连接。同一台 PC 上的其他账户不行,网络另一端也不行。

没有需要输入的账号或密码——Windows 会告知连接方是谁,因此我们只需在创建管道时写上一次「仅限此用户」。

插件

插件如何工作?

它会 把您自己的功能加入 右键点击搜索结果时出现的菜单。

插件是 独立的可执行文件。我们不以 DLL 方式载入应用 — 别人的代码出错时,FastFind 不能跟着崩溃。因此您可以 用任何语言 编写。

FastFind → 플러그인 :  myplugin.exe --path "C:\\file.txt"
플러그인 → FastFind :  표준출력으로 JSON 한 덩어리
可以返回的内容
message弹出提示框
copy复制到剪贴板
open打开该路径
{"action":"message","title":"줄 수","text":"1,284줄"}
{"action":"copy","text":"복사할 내용"}
{"action":"open","path":"C:\\어딘가"}
最短的插件 — 五行 Python

它会数出所选文件有多少行并告诉您。

import sys, json
path = sys.argv[sys.argv.index("--path") + 1]
n = sum(1 for _ in open(path, encoding="utf-8", errors="ignore"))
print(json.dumps({"action": "message", "title": "줄 수",
                  "text": f"{n:,}줄"}, ensure_ascii=False))

把它编译成 exe 放到下面的位置,并在旁边放上 plugin.json

%LOCALAPPDATA%\\FastFind\\plugins\\linecount\\
    run.exe
    plugin.json
{
  "id": "linecount",
  "name": "줄 수 세기",
  "description": "고른 파일의 줄 수를 셉니다",
  "version": "1.0.0",
  "author": "내 이름"
}

重新启动 FastFind 后,结果右键菜单中就会出现 统计行数

已经内置的插件

会一起安装四个。编写时可作参考。

  • 文件信息 — 大小、时间、属性
  • 哈希 — 计算 SHA-256
  • 图像信息 — 尺寸与格式
  • 文本统计 — 行数、词数、字符数

承诺与限制

你们承诺哪些内容不会变?

我们如实说明。我们只承诺 本页面写明的内容

/api/search承诺。 不会删除字段或改变其含义
/api/status只承诺 indexed_filesversionstatus 三个字段
/api/suggest承诺
插件约定承诺
其他接口内部使用。不经通知即变更

程序内部还有更多接口,但大多是我们自己的网页界面在用。公开就意味着不能随意更改的承诺,因此这里 只列出稳定的那些

新字段 可能会增加。这不会破坏现有内容,请让您的代码忽略不认识的字段。

目前还没有的
  • 没有官方库。 需要您自行通过 HTTP 调用
  • 没有变更通知(Webhook)。 文件出现时没有渠道通知您,需要时得自行轮询
  • 插件无法改变结果列表。 目前仅限于从右键菜单执行一件事

如果您有需要,请 告诉我们。只要有人用,我们就做。

命令行也可以

不必使用服务器,也可以直接调用可执行文件。

FastFind.exe --console ext:log > list.txt

详情见 使用指南的命令行 一节。