Есть файл с которым работает программа. Она считывает и записывает в него данные. Во время работы программы файл должен быть заблокирован на запись, но открывать на чтение его можно. Вроде все просто. Нашел такое решение
File.Open("Stat.csv", FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.Read);
Дальше пробуем туда что нибудь записать
File.AppendAllText("Stat.csv", "test" + "\n", Encoding.GetEncoding("windows-1251"));
Выдает ошибку: процесс не может получить доступ к файла, так как файл используется другим процессом. Аналогично возникает проблема с чтением.
File.ReadAllText("Stat.csv");
Подскажите в чем ошибка
Вы делаете неправильно.
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.
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости