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

wwa*_*rby 8 c# file fileinfo

在我的应用程序(C#4.5 winforms app)中,我定期检查文件夹的内容并将找到的任何文件的详细信息存储到数据库中.在这个程序中,我创建了一个FileInfo使用实例new FileInfo(path),和我读的性能CreationTime,LastWriteTime,LastAccessTime,LengthAttributes.我从不在FileInfo实例上调用任何方法.

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

Han*_*ant 12

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

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

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