Возможно, проблема в другой программе - если она пытается открыть файл для монопольного доступа (без общего доступа), не имеет значения, как ваша программа открыла файл - она собирается потерпеть неудачу.
Всякий раз, когда программа пытается открыть файл, вы указываете параметры FileAccess и FileShare (или принимаются значения по умолчанию, если они явно не переданы).
Что нужно сделать Windows, так это проверить все существующие дескрипторы открытых файлов и определить, совместимы ли они. Таким образом, он сравнивает ваш параметр FileAccess с другими параметрами FileShare - разрешено ли вам делать то, что все остальные сказали, что они рады сделать это другим? И затем он выполняет обратную проверку - соответствует ли ваш параметр FileShare с их параметрами FileAccess? - они делают то, что вы рады за них? Только если обе проверки пройдены, ваш конкретный открытый запрос может быть одобрен.
Вы можете использовать что-то вроде Process Monitor для фактического просмотра вызовов Win32, отправляемых на CreateFile , чтобы увидеть, что на самом деле делает каждый процесс.
Блокнот может открыть файл, который был предоставлен для чтения / записи, но не может выполнить обратную запись в файл. Пример программы:
using System.IO;
namespace ConsoleApplication2
{
class Program
{
static void Main(string[] args)
{
var fs = new FileStream(@"C:\Bar.txt", FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite);
fs.Write(System.Text.Encoding.ASCII.GetBytes("abc"),0,3);
fs.Flush();
fs.Close(); //<-- Breakpoint here
}
}
}
Установите заданную точку останова, запустите программу. Когда он достигнет точки останова, откройте Блокнот и используйте его, чтобы открыть C: \ Bar.txt. Все отлично. Добавьте больше текста в файл и нажмите «Сохранить». Вы получите сообщение об ошибке.