在遵循论坛提示 [1] 后,我在 Windows 中执行文件时遇到文件权限问题,但我不明白为什么。也许你们可以帮忙。
我通过执行文件(读取控制台输出)来检查文件的横幅,然后使用 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');
每隔一段时间我就会得到“文件正在被另一个进程使用”。从 Wikipedia 我知道 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