【发布时间】:2016-07-25 14:28:18
【问题描述】:
我想知道是否有一种方法可以创建文件并设置上次写入时间(和其他时间戳信息),而不允许另一个进程在这两个操作之间获取对文件的锁定。
我想这样做的原因是为了解决一个问题,即防病毒软件在文件创建后立即获得对文件的锁定,并且在尝试设置文件属性时仍然拥有锁定。具体来说,我正在使用的代码是 SevenZipSharp(据我所知,不再维护)。
重现此问题的代码是:
var filePath = "test.txt";
using (var fileStream = new FileStream(filePath, FileMode.Create, FileAccess.ReadWrite))
{
var bytes = Encoding.ASCII.GetBytes("Hello fail.");
fileStream.Write(bytes, 0, bytes.Length);
var fileInfo = new FileInfo(filePath);
fileInfo.CreationTime = DateTime.Now;
}
这在执行最后一条语句时会产生以下异常: System.IO.IOException “该进程无法访问文件 'c:\test.txt',因为它正被另一个进程使用。”
我正在考虑使用重试机制实现时间属性的设置,但想知道是否有更优雅的解决方案。
【问题讨论】:
-
为什么在 " 之间不允许另一个进程获取文件的锁" ?为什么以后不能改时间?
-
听起来像防病毒软件正在攻击它并阻止修改?
-
您可以在 fileStream.Dispose() 之后更改 CreationTime。但不是介于两者之间。
-
我可以稍后设置(这是当前 SevenZipSharp 代码所做的),但有时会失败,因为文件被防病毒锁定。
-
CreationTime在您复制文件时不会改变。理论上(如果防病毒是问题),您可以在其他地方创建文件,它不会在其中查找,然后从那里复制它。或者干脆为防病毒添加一个例外。