它是安全的在当前正在写入到一个文件中创建一个FileInfo?(Is it safe to crea

2019-08-05 18:46发布

在我的应用程序(C#4.5的WinForms应用程序),我定期检查文件夹的内容,并发现存储在数据库中的任何文件的细节。 在这个程序中,我创建了一个FileInfo使用实例new FileInfo(path) ,和我读的属性CreationTimeLastWriteTimeLastAccessTimeLengthAttributes 。 我从来没有呼吁任何方法FileInfo实例。

我想知道:有没有腐败,锁定或运行时错误的风险,如果一个文件正在由第三方应用程序写入(或在被复制到被Windows的文件夹的过程),而我创建FileInfo对象或访问它的属性?

Answer 1:

没错,这就是“安全”。 这是在一个非常低的水平,文件系统驱动程序处理。 像FAT或NTFS公共文件系统的一个文件具有在磁盘上的两个不同结构。 首先是目录项,它存储了有关文件的元数据。 好像是这个名字,时间戳,属性和长度。 实际的文件数据被存储在其他地方,存储该文件的数据的簇的链。

FileInfo的专门给你一个文件的元数据。 该文件的数据更敏感,高度如有变更,作为一个过程写入文件。 值得注意的是,你可以锁定访问与文件共享选项的文件数据。 但是没有办法锁定的元数据。 因此你总是可以得到FileInfo的一个文件,而不管其他进程与文件做。

当然,实际的FileInfo性质有可能发生变化,而一个进程写入文件。 他们懒洋洋地更新,尤其是财产的LastAccessTime。 如果你想确保你得到准确的信息不能再更改您需要获取该文件的锁。 通过打开一个与FileShare.Read或FileShare.None文件这样做。 这将确保没有其他进程可以打开文件进行写入,只要你有一个文件打开。 请注意, 可以很容易地抛出IOException,你只能获得锁在没有其他进程,你来之前,打开文件进行写入。



Answer 2:

不,他们不是你正在使用的上下文。

从FileSystemInfo.LastWrite - > MSDN

注意:此方法可返回正确的数值,因为它使用了原生的功能,它们的值可能不是由操作系统来不断更新。

但试想一下,一秒钟,他们正在返回最新值。 如果你已经消耗(取决于时间)值,文件后覆盖,您上次访问值将成为错误/损坏。 因此,这是没有意义的。



Answer 3:

没有问题,请参阅MSDN:

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

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

注意:

当第一检索的属性,FileInfo的调用刷新方法和缓存有关该文件的信息。 在随后的调用,必须调用刷新获取信息的最新副本。



文章来源: Is it safe to create a FileInfo on a file that is currently being written to?
标签: c# file fileinfo