嗯, 顺藤摸瓜:
Windows 文件系统中的“文件ID”通常指的是文件系统为每个文件分配的唯一标识符,也叫“文件引用号”(File Reference Number)或“文件ID”(File ID)。
在 Windows 的 NTFS 文件系统中,每个文件和文件夹都会被分配一个唯一的文件 ID(FileId),即使文件被重命名或移动到其他目录,只要文件没有被删除,这个 ID 通常保持不变(但在某些文件系统如 FAT 中,ID 可能会因为文件移动或碎片整理而改变).
所以, 可以维持这个id不变的条件是:
不影响该id的操作:
重命名
同卷更改位置
更改了文件的内容(注意, 不是删除源文件, 添加新文件的方式)
这个文件 ID 可以通过 Windows API 如 GetFileInformationByHandleEx 获取,具体结构为 FILE_ID_BOTH_DIR_INFO ,其中的 FileId 字段就是文件 ID.
目前不知有何工具提供这个访问功能, 但似乎可以通过自己编写powershell脚本来达到目的.
样例(我这里powershell没有repo, 安装module不成功, 但朋友们可以试试):
# 安装 PSFileId 模块(只需一次)
# Install-Module -Name PSFileId -Force
# 导入模块并获取文件 FileId(即 FRN 的 64 位表示)
Import-Module PSFileId
Get-ItemId "path\to\file.txt"
在这个前提下,Windows的快捷方式不会失效,不需要额外写什么工具,会出问题的就是跨文件系统,或者跨机器设备。
Windows的快捷方式首先验证路径,路径如果不存在会fallback到文件对象ID。只能说楼主的问题可能是个X-Y问题,楼主有一个问题,自己想出来一个方案,但实现有困难,转而询问怎么实现这个方案,从楼主模糊的描述中实在很难准确搞懂到底想要干什么。
Qingwa
(青小蛙)
2025 年6 月 12 日 01:55
24
剧透模式,使用编辑器里的小齿轮菜单里的 的模糊剧透功能,就可以了。
比如上么这段话,是这样的:
剧透模式,使用[spoiler]编辑器里的小齿轮菜单里的[/spoiler]的模糊剧透功能,就可以了。
adoin
(胤玄)
2025 年6 月 12 日 06:38
25
你要的不是软链接,是相对链接,和别的没关系,但是硬盘原理不是这样的,你得改写底层操作系统读取硬盘文件都方式,才能实现吧
“如果它看起来像烤鸭,闻起来像烤鸭,吃起来像烤鸭,那么它非常可能就不是只德州扒鸡。”
moecurl
(catmory)
2025 年6 月 13 日 10:31
27
你这个要属于特殊行业吧,很小众,只能自己写脚本和程序实现.
md文件的 双向链接概念么,在obsidian.比如A<---->B,在obsidian里使用A无论移动到什么地方或者改名字都指向B,B无论移动到什么地方都指向A,这种实现就是内置插件脚本实现的.
你需要的是
1.文件实时监控路径变化.
2.hook任何移动操作的软件进程
3.对原有链接进行删除和重新创建
4.两个系统必然需要有一台主服务器负责监控另一台机器的文件变化,
一般都是webdav挂载
以上在Linux上用shell脚本+inotify+FUSE 构建虚拟文件系统就能实现,windows下powershell需要管理员权限.
AI给一个简单的python脚本,我没测试,只是看看思路
import os
import time
import subprocess
import pyinotify
A_path = '/home/user/A'
B_path = '/home/user/B'
def recreate_links(new_path, old_path):
if os.path.exists(old_path):
os.remove(old_path)
os.symlink(new_path, old_path)
print(f"Linked {old_path} -> {new_path}")
class EventHandler(pyinotify.ProcessEvent):
def process_IN_MOVE_SELF(self, event):
moved_path = event.pathname
if os.path.islink(B_path):
target = os.readlink(B_path)
if target == moved_path:
recreate_links(moved_path, A_path)
if os.path.islink(A_path):
target = os.readlink(A_path)
if target == moved_path:
recreate_links(moved_path, B_path)
wm = pyinotify.WatchManager()
notifier = pyinotify.Notifier(wm, EventHandler())
wm.add_watch(A_path, pyinotify.IN_MOVE_SELF)
wm.add_watch(B_path, pyinotify.IN_MOVE_SELF)
print("Monitoring A and B for movement...")
notifier.loop()
RachelSherman:
在这个前提下,Windows的快捷方式不会失效
快捷方式会在路径/文件名更改后失效
而fileid只在删除/跨卷操作后失效.
这意味着如果在卷内操作,
能引起快捷方式失效的操作
并不会导致fileid的失效
这就让楼主的需求有了一些合理性.
这一点我也是在楼主的提醒下,
顺藤摸瓜学习了解到的.
现在的问题是,
是否有这么个工具是依据fileid来进行连接的?
sav3uluan:
快捷方式会在路径/文件名更改后失效
你实际操作一下就知道了,并不会失效,快捷方式本身就会fallback到对象id。快捷方式比很多人想象得更加robust。
顺藤摸瓜2:
Windows 的快捷方式(.lnk 文件)不仅仅保存了目标文件/文件夹的绝对路径,还利用了名为“分布式链接跟踪”(Distributed Link Tracking)的机制。当你重命名或移动目标文件/文件夹时,快捷方式会尝试通过一系列元数据(如文件的唯一标识、大小、创建时间等)重新定位目标对象,即使其路径发生了变化,仍然能正确指向新位置.
当击快捷方式时,系统首先尝试用快捷方式内保存的路径直接访问目标对象。
如果找不到,Windows 会用分布式链接跟踪技术,根据目标对象的唯一标识等信息(就包括fileid, 或者也叫object id) 在本地磁盘上检索,若找到则自动更新快捷方式的目标属性
如果仍找不到,才会提示目标已丢失
以上是ntfs的一种机制. 同样和顺腾摸瓜1中提到的一样, 不支持跨卷操作.
Windows 并没有提供专门的图形界面选项来关闭快捷方式的重定向特性。但可以通过停用Distributed Link Tracking Client服务来间接实现关闭此特性的目的.
综上:
在windows的ntfs磁盘中, 只要不进行跨卷操作, 不关闭相应的服务的前提下. 使用lnk连接就能满足楼主的需要.
摸瓜到这里, 我才理解你之前说的这句话是什么意思.
原谅我(们)的知识储备的不足. 无法get到您的提示.