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

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

我创建了一个指向我的 Dropbox 目录中文件的硬链接 - 该链接是在一个文件夹中创建的,该文件需要位于该文件夹中,以便我用来编辑它的程序可以访问它 -

mklink /h path_to_hard_link C:\dropbox\git\repo\existing_file

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

我究竟做错了什么 ?

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

EDIT2:根据 surfasb 链接的文章:

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

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

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

如果我理解正确的话,这意味着我可以有 69 个硬链接(实际上最多 1023 个)到同一个文件,显示不同尺寸对于同一个文件?!

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

答案1

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

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

有些直接编辑文件,它们应该可以完美地处理硬链接。虽然直到现在我才知道“文件信息差异”问题......

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

所以是的 - 硬链接可以而且将会中断 - 这限制了它们的实用性 - 想法很糟糕。

如果有错请纠正我

答案2

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

我经常看到这个问题。我总是告诉人们去 Technet 上阅读 NTFS 的文档。

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

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

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

编辑对以下评论的回复。

会读到这篇文章 - 但 a) 我实际上最关心的是 LMT,并且 b) 文件的大小和内容都没有改变 - 它可能依赖于程序吗?它绝对不应该。我开始欣赏 Unix 和这里的 i 节点 - 编辑:大小和时间不应该传播(需要确认这一点),但内容应该

这篇文章专门针对您的问题。我将引用该文章。强调是我加上的。

文件内容应该已经改变,否则你做错了。

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

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

现在我假设你正在通过 Explorer 查看所有这些内容。Explorer 列出信息的方式与键入目录在 cmd 行。目录列表就是列表。读取目录列表才不是访问文件,这一点很重要。否则,获取目录列表将导致所有文件的最后访问时间发生更改!!因此,如果存在硬链接,您将获得过时的信息。您可以通过右键单击并说“检查详细信息”选项卡来强制 Explorer 访问文件。或者直接打开文件。

编辑3

没有完全理解其中的区别 - 当在 foo.txt 上按 ^c 然后按 ^v 时(因此 windows 会创建一个类似 foo - Copy.txt 的文件并将其放在当前目录中) - 这是在哪种意义上的复制?

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

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

编辑4

好吧,根据 surfasb,我确实理解得没错——这是文件系统的一个限制——我现在很欣赏 inode 概念。无论如何——奇怪的是——情况并非总是如此——有时属性的更改会立即在原始文件中可见——当发生更改时——我现在真正担心的是,我正在使用的至少一个程序似乎不会编辑链接的文件,而只会编辑硬链接。可能吗?dir /a 不会显示太多有关硬链接的信息——有任何方法可以查看它们

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

Adir /a不会更新目录条目。这是设计使然,因为这会占用大量性能。

相关内容