【问题标题】:How does MS Visual Studio determine that source file have changed?MS Visual Studio 如何确定源文件已更改?
【发布时间】:2012-02-09 21:37:50
【问题描述】:

它是否使用修改时间戳或/和是否检查实际内容是否已更改(例如通过比较校验和)?

编辑:我需要知道这一点,因为我使用 Git 进行源代码控制并且经常更改分支。似乎有时即使我将分支改回并强制(例如,从 developmaster 然后回到 develop),VS 还是会重建一半的源文件。我想知道为什么会发生这种情况,为什么有时会发生而其他时候不会发生。

【问题讨论】:

  • 这是什么版本的VS?您使用什么语言?
  • @ConradFrix VS2008,C++。
  • 投票结束的人 - 编程工具是on topic SO :)

标签: visual-studio file-io compilation


【解决方案1】:

由于 Visual Studio 是一个闭源项目,我敢打赌只有开发人员才能对它的工作原理给出明确的答案。但是,就我的目的而言,测试一些场景就足够了。

我已经用一个小解决方案和其中的几个文件(一个头文件和两个源文件)对其进行了测试。测试结果得出以下结论。 Visual Studio 查找修改日期和时间。即使文件内容相同 - 它也会编译此文件以及包含它的任何其他文件。如果修改日期和时间相同,即使内容不同也不会重新编译。 Visual Studio 会忽略创建和访问日期和时间。

【讨论】:

  • 我只是做了一些我自己的测试,因为我想知道它是否保持每个文件每个构建的修改时间。从我的测试来看,它只保留最后一次构建时间,然后将其与文件的最后修改时间进行比较。因此,仅当文件的修改时间超过最后一次构建时间时,它才会重新编译。即使进步但不够,也不会重新编译。
【解决方案2】:

我猜它在项目目录和链接文件(如果有的话)上使用FileSystemWatcher,只是因为它是做这种事情的正确方法。

一些谷歌搜索找到了更多关于这个类的信息(或者你自己查一下):

当然,当源文件打开时,它是编辑时的内容,以及任何用户更改(甚至未保存)都加载到 RAM 中,但它不会将其与磁盘内容进行比较(即' d 太慢),当系统告诉它文件已更改时,它会监听系统事件。

更新:

可能不是那个类本身,而是它的 Win32 版本,你知道大多数系统相关的 .NET 功能类只是 Win32 包装器。

来自 StackOverflow 的回答:How does FileSystemWatcher work on another computers directory?
我认为它包装了这个 API(不确定):http://msdn.microsoft.com/en-us/library/aa365465.aspx

更新 2:

这是微软监控文件更改的方法:
http://msdn.microsoft.com/en-us/library/chzww271(v=vs.80).aspx

更新 3

这是一个旧答案,上面提到这是一个猜测,因为 Visual Studio 是封闭源代码,正如其他答案中提到的那样。值得一提的是,accepted answer 建议 Visual Studio 改为查找文件修改日期,这表明它没有使用在这个答案中猜测的方法,并且它是错误.

我希望读者不介意为合理化此答案中的可能性所做的努力(导致读者不适或投反对票)。仅出于存档原因保留它。

【讨论】:

  • 除了 2010 年的 WPF 用户界面组件之外,VS 主要不是 Win32 吗?
  • 对,只是在考虑一般的方法。甚至这个 .NET 类也可能(像其他类一样)只是一个 Win32 包装器。应用注释以发布更新。
  • 这个答案说明了为什么要求推测的问题没有建设性...... 猜测 VS 使用什么来做到这一点有什么意义?
  • 但是如果我在 VS 不活动时更改文件会发生什么?此外,据我所知,Windows 将常用文件缓存在内存中,并将所有读/写重定向到此内存。与硬盘的同步延迟到以后。如果我错了,请纠正我。
  • @AndrewBarber 我使用 Git 进行版本控制并且经常更改分支。这会导致某些文件更改时间戳,但不会更改实际内容。我想了解 Visual Studio 如何处理这个问题。根据我的经验,它似乎每次都不同,我不认为这是实际发生的情况。可能我只是不明白它是如何工作的。
猜你喜欢
  • 1970-01-01
  • 2015-02-24
  • 1970-01-01
  • 1970-01-01
  • 2016-12-19
  • 2016-03-24
  • 1970-01-01
  • 2021-08-08
  • 1970-01-01
相关资源
最近更新 更多