C# 查找具有特定备用数据流的所有文件是否是存储自定义标记的有效方法?

C# 查找具有特定备用数据流的所有文件是否是存储自定义标记的有效方法?,c#,.net-4.0,ntfs,alternate-data-stream,C#,.net 4.0,Ntfs,Alternate Data Stream,我正在为最终用户编写一个启动器/安装程序,其中包括在“开始”菜单和/或桌面上生成快捷方式 理想情况下,我希望这些快捷方式支持这些场景: 用户根据自己的喜好更改显示的名称 用户将快捷方式移动或复制到其他地方(例如,快速启动) 启动器稍后会发现它需要更新快捷方式的图标和/或目标位置 现在,launcher对此并不聪明——如果它已经找到了一个具有当前名称的快捷方式,它将不使用它;如果没有,它将创建一个新的。因此,如果用户或启动器的数据库更改了有关快捷方式的某些内容,那么您现在将得到一个当前的快捷方

我正在为最终用户编写一个启动器/安装程序,其中包括在“开始”菜单和/或桌面上生成快捷方式

理想情况下,我希望这些快捷方式支持这些场景:

  • 用户根据自己的喜好更改显示的名称
  • 用户将快捷方式移动或复制到其他地方(例如,快速启动)
  • 启动器稍后会发现它需要更新快捷方式的图标和/或目标位置
现在,launcher对此并不聪明——如果它已经找到了一个具有当前名称的快捷方式,它将不使用它;如果没有,它将创建一个新的。因此,如果用户或启动器的数据库更改了有关快捷方式的某些内容,那么您现在将得到一个当前的快捷方式,而另一个则不是

为了正确地跟踪快捷方式,包括移动和复制,我想知道在每个快捷方式中放置一个NTFS备用数据流“FoobarInstaller.Shortcut”,其中只包含一个UUID是否是一个可行的选择。理想情况下,我希望扫描整个用户目录树(或者可能只是典型的位置,如桌面、开始菜单和快速启动),查找流中的文件,并查看是否需要对这些文件应用更新


我不知道这是否有效。NTFS/Win32是否提供了一个API来高效地按名称查找具有特定ADS的所有文件?

NTFS有一种唯一标识文件的方法:对象ID。它们在重命名时不会更改,您可以按id查找文件。您可以将对象id数据库保存在一个众所周知的位置(例如,在用户应用程序数据目录中)。然后,您可以在固定时间内找到所有现有快捷方式


我相信某些Windows的“移动快捷方式修复”功能会使用此功能。

我考虑过这一点,但复制快捷方式后会发生什么?我能得到对象ID的分支吗?不能,因为操作系统不知道文件副本。拷贝是对一个不相关的文件先读后写。是否拷贝广告由进行拷贝的程序决定。通常,使用CopyFile API,它也会复制流。手动复制循环几乎肯定不会做到这一点。归档程序也不尊重广告的内容。所以在普通情况下你可能会很幸运。对-在用户使用Windows资源管理器在某处复制快捷方式的典型情况下,ADSE也应该被复制。对于归档程序、备份等,这对我的用例没有多大影响。