У меня есть проблема с правами доступа к файлам при запуске файлов в 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);
Но я не понимаю, почему. Есть ли здесь условия гонки, которых я не вижу?
Кроме того, вызов File.Open, по-видимому, выполняется намного быстрее с FileShare.ReadWrite, а не по умолчанию (я полагаю, это FileShare.Read).
[1] http://www.xtremevbtalk.com/archive/index.php/t-192118.html
[2] http://en.wikipedia.org/wiki/File_locking#In_Microsoft_Windows