Есть файл с которым работает программа. Она считывает и записывает в него данные. Во время работы программы файл должен быть заблокирован на запись, но открывать на чтение его можно. Вроде все просто. Нашел такое решение
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
.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Почему данный код вписывает в файл числа только до 359?
Я начинал изучатьFramework MonoGame/XNA языка C#,уже понимаю устройство программы,но не могу понять зачем нужен метод Initialize()
За комментировал строки которые не могу понять, помогите разобратьсяСпасибо