Другие языки программирования и технологии

C# Помогите со StreamReader и StreamWriter, ситуация жуть!

1)
Одним классом я считываю текстовый файл, их около 100 шт. в папке D:\dir1\
private System.IO.StreamReader textfile = new System.IO.StreamReader(@"D:\dir1\" + Название_Текста + ".txt");
Как я считываю информацию с текстового файла:
string Строка;
while ((Строка = textfile.ReadLine()) != null)
{
Массив_Строк. Add(Строка);
}
textfile.Close();
1. Название_Текста - string значение, я проверил он в любых случаях совпадает с названием реального текстового файла в папке D:\dir1\
2. После того, как я забрал из текстового файла необходимую мне информацию, я вызываю функцию textfile.Close();
!!! Как выясняется далее, файл все-таки не закрывается, как я это выяснил опишется позже !!!
2) Вторым классом я записываю в текстовый файл информацию в ту же папку D:\dir1\
System.IO.StreamWriter file = new System.IO.StreamWriter(@"D:\dir1\" + Название_Текста + ".txt");
Как я записываю информацию в текстовый файл:
file.WriteLine("Строка №1");
file.WriteLine("Строка №2");
file.Close();
!!! В данном месте, т. е. где должна производиться запись в файл, постоянно выдает ошибку, что данный текстовый файл уже открыт и не может сейчас использоваться. !!
3)Как я определил, что файл не закрывается:
Первый класс (там, где с текстового файла считывается информация) работает нормально (в нем не выдает ошибок компилятор), изменил я только во втором классе дирректорию, куда записывать файл
System.IO.StreamWriter file = new System.IO.StreamWriter(@"D:\dir2\" + Название_Текста + ".txt");
Т. е. изменил всю строчку объявления file. И записывает без выдачи ошибки, то есть уже Записывает!
---
4)Зачем мне записывать в тот же файл, с которого я считывал информацию? Я эту информацию дополняю и "перезаписываю" файл, перезаписанная инфа постоянно мониторится еще одним классом
---
Явных проблем в архитектуре самой программы нет, над этим постарался.
Просто почему-то не разрешается перезаписывать в тот же файл.
Помогите, пожалуйста.
вы открываете файл каждый раз заного для чтения\перезаписи\дозаписи - открывайте файл сразу со всеми нужными режимами... т. е. и на чтение и на запись и на создание (создание - на случай отсутствия искомого файла, если его отсутствие не должно вызывать ошибки)
Ерлан Наиман
Ерлан Наиман
512
Лучший ответ
И так, раз такое дело, то тебе стоит поэксперементировать с методами:
Dispose()
Dispose(Boolean)
Finalize()
Close()

Методом тыка посмотри какой из них 100% освобождает ресурсы
Eldos Zhumakaev
Eldos Zhumakaev
11 382
Василий Каллаур Есть предположение:
StreamReader и StreamWriter конфликтуют при подключении к 1 и тому же файлу.
Можно сделать Stream файла с доступом чтения и записи одновременно? экземпляр будет 1 и после каждого действии чтения и записи будет закрываться.
Как вы это рассматриваете?
Василий Каллаур Проблему решил так:
1. Чтение из файла:
using (System.IO.StreamReader readfile = new System.IO.StreamReader(@Вернуть_Дирректорию_Файла_Для_Чтения_По_Имени_Героя (Имя_Героя)))
{
while ((Строка = readfile.ReadLine()) != null)
{
Массив_Строк. Add(Строка);
}
readfile.Close();
}
Спасибо а попытку помочь, хоть она была тщетна. Блин, я 35 руб потратил чтобы вопрос стал популярным. Жаль.
>>Явных проблем в архитектуре самой программы нет, над этим постарался.
У вас наглядная 100% ПРОБЛЕМА (именно капсом) в архитектуре, а теперь поясню
1) Если вы постоянно работаете с файлом - во первых отображайте его в память, это ускорит обработку и снимет часть нагрузки с винчестера, но это актуально больше для ssd, привыкайте сразу делать грамотно.
2) Если таки работа с файлом нужна из нескольких мест - заведите переменную для работы с этим файлом, и держите его открытым всегда, просто передавайте из класса в класс ссылку на него
3) Ну и наконец третье зачем вы открываете файл каждый раз заного для чтения\перезаписи\дозаписи - открывайте файл сразу со всеми нужными режимами... т. е. и на чтение и на запись и на создание (создание - на случай отсутствия искомого файла, если его отсутствие не должно вызывать ошибки)

зы.. а вообще работать с файлом не есть кароший тон, загрузите в память файл и работайте с его копией в памяти, я ведь верно понял что файлы сравнительно не большого размера?)
Василий Каллаур Спасибо за критику! Ее так не хватало.
Что вы имеете ввиду под выражением "капсом"?
1) я так понял однажды открыть файл и переместить все его данные в оперативную память в защищенную ячейку, закрывается только в случае закрытия программы или вызова определенной функции программой. Вносить изменения в эту ячейку и при окончательном сохранении записывать в файл и освобождать ячейку в оперативке. Как это сделать? Ума не приложу.
2) Пытался держать открытым, возникает исключение типа "файл уже используется" при попытке перезаписи данных.
3) Загружаю данные (текст, который потом по определенной закономерности преобразую в таблицу в программе и производится удобные манипуляции) из файла, в режиме онлайн я абстрактно меняю табличные значения, жму "сохранить" и файл, с которого я считывал данные, п
//открой нативно
FileStream _sn = new FileStream("myfile.txt", FileMode.OpenOrCreate,FileAccess.ReadWrite);
StreamWriter _sn_writer = new StreamWriter(_sn);
StreamReader _sn_reader = new StreamReader(_sn);

//оператион

_sn.Close();
Василий Каллаур если в проекте доступ к 1 и тому же файлу задавать двумя переменными и проект будет глобально знать об их существовании, то возникнет ошибка, что уже используется файл при попытке подключения записывающей переменной к файлу. Как я уже написал в дополнении к вопросу, проблема решается путем применения using (System.IO.StreamReader readfile = new System.IO.StreamReader(файл))
{
///
}
и
using (System.IO.StreamWriter readfile = new System.IO.StreamWriter(файл))
{
///
}
И так, раз такое дело, то тебе стоит поэксперементировать с методами:
Dispose()
Dispose(Boolean)
Finalize()
Close()

Методом тыка посмотри какой из них 100% освобождает ресурсы
Такой геморой с текстовыми файлами. УЖАС!!!!
K.abeshov.n
K.abeshov.n
714
ОЧЕНЬ СЛОЖНО!!
K-
Konstantin ------
265
FileStream sn = new FileStream("ВАШФАЙЛ. РАСШИРЕНИЕ", FileMode.OpenOrCreate,FileAccess.ReadWrite);
StreamWriter sn_write = new StreamWriter(sn);
StreamReader sn_read = new StreamReader(sn);
//Закрытие потока
sn.Close();
ой ёёёёёёёёёёёёёёёёёёёёёёёёёёёёёёё
Зачем nul? Если есть EOF
Оч сложнл