我在Windows上执行文件时遇到了文件权限问题,根据一个论坛提示[1]解决了这个问题,但是我不知道为什么会这样。希望你们能帮忙解释一下。
我通过执行文件(读取控制台输出)来检查文件的标语,然后使用FileStream打开同一文件进行读取:
public void fileMD5(string filename) {
if (!File.Exists(filename)) return NT.Fail("File does not exist: " + filename);
BinaryReader stream = new BinaryReader(File.Open(filename,
FileMode.Open, FileAccess.Read, FileShare.ReadWrite));
int bufferSize = 4096;
byte[] buffer = new byte[bufferSize];
int readBytes;
while ((readBytes = stream.Read(buffer, 0, bufferSize)) > 0) {
md5Hasher.TransformBlock(buffer, 0, readBytes, buffer, 0);
}
stream.Close();
}
fileMD5('sample.exe');
每隔一段时间我会收到“文件正在被另一个进程使用”的消息。从维基百科上了解到,Windows 会在执行文件时设置锁定以拒绝写入权限[2],但我只是在读取。此外,当我尝试打开它时,该进程应该已经停止。
从论坛帖子上看来,添加 FileShare.ReadWrite 应该会有所帮助,并且似乎确实有效:
FileStream stream = File.Open('sample.exe',
FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
但是我不明白为什么会这样。这里是否存在我没有看到的竞态条件?
此外,使用FileShare.ReadWrite而不是默认值(我猜是FileShare.Read),调用File.Open似乎要快得多。
[1] http://www.xtremevbtalk.com/archive/index.php/t-192118.html
[2] http://en.wikipedia.org/wiki/File_locking#In_Microsoft_Windows