Windows 7 mklink - 硬链接的属性(预期!)+ 内容不影响链接文件

Mr_*_*s_D 6 windows-7 hardlink mklink

我创建了一个指向我的保管箱目录中的文件的硬链接 - 该链接是在一个文件夹中创建的,该文件需要在该文件夹中被我用来编辑它的程序访问 -

mklink /h path_to_hard_link C:\dropbox\git\repo\existing_file
Run Code Online (Sandbox Code Playgroud)

我开始使用硬链接。在某些时候,我意识到更改不会传播到 repo\ 中的文件 - 文件大小、修改日期,什么都没有 - 甚至不是内容。

我究竟做错了什么 ?

编辑:是否可能依赖于程序?我的意思是我用于这些文件的编辑器确实编辑它们 - 但只编辑硬链接。链接的文件未被修改。此外,此编辑器似乎无法跟踪符号链接

EDIT2:根据surfasb链接的文章:

由于硬链接是文件的目录条目,因此应用程序可以使用其任何硬链接来修改文件。使用任何其他硬链接的应用程序可以检测到更改。

这意味着当使用适当的编辑器直接打开原始文件时必须包含修改 - 不仅仅是通过其硬链接 - 对吗?

但是,只有当用户使用硬链接访问文件时,才会更新硬链接的目录条目。例如,如果用户使用硬链接打开和修改文件,并且原始文件的大小发生变化,则用于访问该文件的硬链接也会显示新的大小。

如果我正确理解了这个可悲的英语样本,这意味着我可以有 69 个硬链接(实际上最多 1023 个)到同一个文件,显示同一个文件的不同大小?!

编辑 3:根据 surfasb 我确实理解这一点 - 文件系统的限制。无论如何 - 奇怪的事情 -情况并非总是如此- 有时属性的更改会立即返回到原始文件中 - 当有更改时 - 我现在真正担心的是我正在使用的至少一个程序似乎没有编辑链接的文件,但只有硬链接。可能的 ? dir /a没有透露太多关于硬链接的信息 - 有什么办法可以看到它们吗?

Mr_*_*s_D 5

我认为答案是(引自一些乐于助人的人):

您必须考虑的是应用程序/程序处理文件的方式。

有些直接编辑文件,并且它们应该可以与硬链接完美配合。虽然直到现在我才知道“fileinfo差异”问题......

其他应用程序复制该文件,然后在保存编辑后的版本时删除旧文件。这个程序显然打破了隐藏复制操作的硬链接。他们保存的不再是他们打开的文件。当他们删除旧版本时,他们会从目录中删除这个单一的硬链接。其他硬链接仍然存在,因此您最终会得到两个文件。

所以是的 - 硬链接可以而且将会中断 - 这限制了它们的实用性 - 深思熟虑。

如果错了请纠正我


sur*_*asb 3

您是否打开了“上次访问时间”设置?由于性能原因,从 Vista++ 开始,它默认关闭。

我经常看到这个问题。我总是告诉人们访问 technet 并阅读有关 NTFS 的文档。

http://technet.microsoft.com/en-us/library/cc781134(WS.10).aspx

请注意,它表示 NTFS 不会立即将 LAT 写入磁盘。它通常会等待一个小时的差异,或者只是将其自身搭载到写入该文件的更改中。然而,基于文件的查询正确的。

这不是审计工具。在某些情况下,NTFS 不会性能为代价更新 LAT。如果您正在寻找审核工具,我建议您打开本地安全审核。与 LAT 不同,它将记录对文件的所有访问。例如,您可以使用许多不会影响 LAT 的 API 调用。

编辑下面评论的回复。

将阅读本文 - 但是a)我实际上最关心的是LMT,b)甚至文件的大小和内容都没有改变 - 它可以依赖于程序吗?绝对不应该。我开始欣赏 Unix 和 i 节点 - 编辑:大小和时间不应该传播(需要对此进行确认),但内容应该

这篇文章专门解决了您的具体问题。我就引用一下这篇文章吧。强调是我加上的。

文件内容应该已经改变,否则你没有做对。

由于硬链接是文件的目录条目,因此应用程序可以使用文件的任何硬链接来修改文件。使用任何其他硬链接的应用程序都可以检测到更改。 但是,仅当用户使用硬链接访问文件时,硬链接的目录条目才会更新。例如,如果用户使用硬链接打开并修改文件,并且原始文件的大小发生更改,则用于访问该文件的硬链接也会显示新的大小。

因此,当文件本身发生更改时,相应的目录条目将不会更新,除非正在访问它们。因此,如果您通过两个相应的硬链接打开了一个文本文件,那么两个目录条目都会更改。现在,如果您仅通过硬链接 A 打开文件,则硬链接 B 将不会更新。该文件将包含您所做的任何更改。但同样,硬链接是目录条目,如果您不使用它,NTFS 不会更新目录条目。这会浪费 I/O。

现在我假设您正在通过资源管理器查看这一切。资源管理器列出的信息与在 cmd 行中键入dir非常相似。目录列表就是一个列表。然而,读取目录列表并不会访问该文件,这一点很重要。否则,获取目录列表将导致所有文件的最后访问时间发生更改!因此,如果存在硬链接,您将获得过时的信息。您可以通过右键单击并检查详细信息选项卡来强制资源管理器访问该文件。或者只是打开文件。

编辑3

不完全明白区别 - 当在 foo.txt 上点击 ^c 然后 ^v (因此 Windows 创建一个像 foo 一样的文件 - Copy.txt 并将其放置在当前目录中) - 这是在什么意义上复制?

这很棘手,因为我不知道资源管理器如何处理将现有文件复制到其当前目录中。所以我必须测试一下这个。看起来资源管理器会复制源文件目标,无论源文件是硬链接还是符号链接。

资源管理器对符号链接和硬链接没有非常精细的控制和支持。现在,如果您这样做,可以复制链接本身"mklink /h Foo1.txt Foo.txt"。这将创建一个名为 的新硬链接Foo1.txt。但您不能在资源管理器中执行此操作。我建议您获取 Link Shell 扩展。它使用自定义快捷箭头图标覆盖链接,枚举目标,并允许显式创建符号链接和硬链接。

编辑4

根据 surfasb 的说法,我确实正确理解了这一点 - 文件系统的限制 - 我现在欣赏 inode 概念。无论如何 - 奇怪的事情 - 情况并非总是如此 - 有时属性的更改立即可见回到原始文件 - 当发生更改时 - 我现在真正关心的是我正在使用的至少一个程序似乎无法编辑链接的文件但只有硬链接。可能的 ?dir /a 没有透露太多有关硬链接的信息 - 任何方式都可以看到它们

我不记得看到过你问题的这一部分。我很好奇不编辑链接文件的程序。这是哪个程序?

Adir /a不会更新目录条目。这是设计使然,因为这将是性能密集型的。