在当前正在写入的文件上创建FileInfo是否安全?

时间:2013-01-06 12:38:17

标签: c# file fileinfo

在我的应用程序(C#4.5 winforms app)中,我会定期检查文件夹的内容,并将找到的任何文件的详细信息存储到数据库中。在此例程中,我使用FileInfo创建了一个new FileInfo(path)实例,并且我阅读了属性CreationTimeLastWriteTimeLastAccessTimeLength和{ {1}}。我从不在Attributes实例上调用任何方法。

我想知道:如果我创建的文件当前正被第三方应用程序写入(或者在被Windows复制到文件夹的过程中),是否存在损坏,锁定或运行时错误的风险FileInfo对象或访问它的属性?

3 个答案:

答案 0 :(得分:11)

是的,这是“安全的”。这是在非常低的级别处理的文件系统驱动程序。常见文件系统(如FAT或NTFS)上的文件在磁盘上具有两个不同的结构。首先是目录条目,它存储有关该文件的元数据。像名称,时间戳,属性和长度。实际的文件数据存储在其他地方,这是一组存储文件数据的集群。

FileInfo专门为您提供文件的元数据。文件数据更加敏感,在进程写入文件时极易受到更改。值得注意的是,您可以使用FileShare选项锁定对文件数据的访问。但是没有办法锁定元数据。因此,您始终可以获取文件的FileInfo,无论其他进程正在对该文件执行什么操作。

当然,当进程写入文件时,实际的FileInfo属性可能会发生变化。它们更新 lazily ,尤其是LastAccessTime属性。如果您想确保您拥有无法更改的准确信息,则需要获取该文件的锁定。通过使用FileShare.Read或FileShare.None打开文件来执行此操作。只要您打开文件,这就确保没有其他进程可以打开文件进行写入。请注意, 可以轻松抛出IOException,只有当你没有其他进程出现并打开文件进行编写时,你才能获得锁定。

答案 1 :(得分:1)

不,他们不在你正在使用的环境中。

来自FileSystemInfo.LastWrite -> MSDN

  

注意此方法可能返回不准确的值,因为它使用的是本机函数,其值可能无法由操作系统不断更新。

但想象一下,他们正在回归最新的价值观。如果您已使用该值(取决于时间),并且之后文件被覆盖,则您上次访问的值将变为错误/已损坏。所以这没有意义。

答案 2 :(得分:0)

没问题,请看msdn:

http://msdn.microsoft.com/en-us/library/system.io.fileinfo.aspx

线程安全 此类型的任何公共静态(在Visual Basic中为Shared)成员都是线程安全的。不保证任何实例成员都是线程安全的。

通知:

首次检索属性时,FileInfo会调用Refresh方法并缓存有关该文件的信息。在后续调用中,您必须调用Refresh以获取信息的最新副本。