Чтение запись в файл с блокировкой

348
15 августа 2017, 12:21

Есть файл с которым работает программа. Она считывает и записывает в него данные. Во время работы программы файл должен быть заблокирован на запись, но открывать на чтение его можно. Вроде все просто. Нашел такое решение

File.Open("Stat.csv", FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.Read);

Дальше пробуем туда что нибудь записать

File.AppendAllText("Stat.csv", "test" + "\n", Encoding.GetEncoding("windows-1251")); 

Выдает ошибку: процесс не может получить доступ к файла, так как файл используется другим процессом. Аналогично возникает проблема с чтением.

File.ReadAllText("Stat.csv");

Подскажите в чем ошибка

Answer 1

Вы делаете неправильно.

File.Open — это не функция, которая «открывает» файл и всё. Эта функция возвращает вам поток, который и имеет эксклюзивный доступ к файлу. Вы должны писать в файл через этот поток.

File.AppendAllText ничего не знает о потоке, который возвратила функция File.Open. Он пытается открыть новый поток, но поскольку ваш файл заблокирован функцией File.Open, ничего не выходит.

Попробуйте так:

using (var file = File.Open("Stat.csv", FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.Read))
using (var text = new StreamWriter(file, Encoding.GetEncoding(1251)))
{
    text.WriteLine("test");
}

Если вам нужно держать файловый поток открытым, делайте как-то так:

private FileStream file;
// инициализация
file = File.Open("D:\\Stat.csv", FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.Read);
// запись в файл
using (var text = new StreamWriter(file, Encoding.GetEncoding(1251), 1024, leaveOpen: true))
{
    text.WriteLine("test");
}

Параметр leaveOpen: true важен!

В конце работы имеет смысл сделать file.Dispose(), для этого, по идее, включающий это поле класс должен бы тоже реализовать IDisposable.

READ ALSO
Почему данный код вписывает в файл числа только до 359?

Почему данный код вписывает в файл числа только до 359?

Почему данный код вписывает в файл числа только до 359?

185
Загрузка значений из файла xml

Загрузка значений из файла xml

Имею такой xml файл

246
Initialize() в Monogame

Initialize() в Monogame

Я начинал изучатьFramework MonoGame/XNA языка C#,уже понимаю устройство программы,но не могу понять зачем нужен метод Initialize()

215
Сортировка выбором. Поясните момент

Сортировка выбором. Поясните момент

За комментировал строки которые не могу понять, помогите разобратьсяСпасибо

187