2009-11-24 35 views
2

现状:是否有更好的方法来覆盖文件,然后检查更改(在C#中)?

我有一个C#程序,它具有以下功能:

  • 生成许多文件(更换产生最后一次程序运行起来的人。)
  • 阅读这些文件并执行耗时的计算。

问题:

我只想执行上,因为我最后一次运行该程序实际上已更改的文件耗时的计算。

解决方案1:

  • 重命名旧文件。
  • 写入新文件。
  • 阅读并比较两个文件。

这涉及到写入一个文件和读取两个文件,这看起来好像比需要更多的磁盘访问。

解决方案2:

  • 写入字符串,而不是一个文件。
  • 读取旧文件并与字符串进行比较。
  • 如果它们不同,请覆盖旧文件。

这将涉及阅读一个文件,并可能写一个文件,这似乎是对我的第一个想法的重大改进。

问:

你能描述一个更好的办法来解决我的问题? (并解释为什么它更好?)

回答

4

一个解决方案可能是从文件的内容生成某种校验和。然后当你生成一个新的内容时,你只需要比较校验和值来查看文件是否已经改变。

将校验和存储为文件中的第一条记录(或至少相当接近文件的起始位置),以最大限度地减少必须读取的数据量。

如果您可以以某种方式将校验和存储为文件的属性(而不是文件本身),则甚至不需要打开旧文件。另一种选择是将校验和及其引用的文件存储在另一个中央文件或数据库中,但存在可能失调的危险。

+0

谢谢,这是我的问题的有效解决方案。将所有校验和保存在一个文件中以便可以按顺序读取会更好吗? – 2009-11-24 22:08:05

+1

MD5散列可以说在文件名中是正确的。 – 2009-11-24 22:10:50

+0

@Paul - 我的选择是将它们附加到文件中,因为它们不太可能会失步,但将它们保存在单独的文件中没有任何问题。 – ChrisF 2009-11-24 22:11:53

0

在每次运行结束时,将执行时间保存到文件中。

在下次运行期间,创建所有新文件后,使用DirectoryInfo遍历目录中的文件,并根据存储的执行时间检查每个文件的GetLastWriteTime(http://msdn.microsoft.com/en-us/library/system.io.file.getlastwritetime.aspx)。如果LastWriteTime在保存的时间之后,那个文件被当前执行修改,所以你必须处理它。

+0

不幸的是,这在我的情况下不起作用。写入文件时,无论最终结果是否为相同的文件,“写入时间”总是会更新。 – 2009-11-24 22:28:10

相关问题