Работа с файлами

jenya7
Дата: 09.07.2014 10:17:13
У меня есть 300-400 файлов в каждом 200-300 строк. Количество файлов как и их размер постоянно растет и уже сейчас на некоторых заковыристых операциях гуи подмораживается. Есть операции как чтения так и изменения некоторых строк в файле.
Соответственно встает вопрос оптимизации.
Порывшись в гугле я остановился на двух подходах.
Первый
private void GetStepname(string[] files, string stepname)
{
foreach (string file in files)
{
  sr = new StreamReader(file);
  using (sr)
 {
     while (!sr.EndOfStream)
    {
       line = sr.ReadLine();
       if (line.Contains(stepname))  //search for a limit  
       //и так далее           
   }

}
}

Второй
private void GetStepname(string[] files, string stepname)
{
    foreach (string file in files)
   {
       string[] text = File.ReadAllLines(file);
      for (int i = 0; i < text.Length; i++)
      {
           if (text[i].Contains(stepname))
          //и так далее           
      }
}
}


Вопрос, какой предпочтительней.
И еще такой вопрос - перебор файлов делать внутри метода или снаружи
private void buttonGetFields_Click(object sender, EventArgs e)
{
    string[] files = new string[listBoxFiles.SelectedItems.Count];
    listBoxFiles.SelectedItems.CopyTo(files, 0);
    GetStepname(files, stepname);
}

Или
private void buttonGetFields_Click(object sender, EventArgs e)
{
    foreach (string file in listBoxFiles.SelectedItems)
    {
        GetStepname(file, stepname);
    }
}
Arm79
Дата: 09.07.2014 10:40:28
а что вы делаете с этими файлами?
Изопропил
Дата: 09.07.2014 10:42:48
jenya7

Вопрос, какой предпочтительней.
И еще такой вопрос - перебор файлов делать внутри метода или снаружи


Приходит Сара к раввину.
– У меня сегодня брачная ночь, так я думаю: мне в постель лечь в комбинации или без?
В это время прибегает Абрам:
– У меня проблема: коммунисты хотят, чтобы я вступил в колхоз! Что делать?
Раввин:
– Абрам, вступишь ты в колхоз или нет – тебя все равно вые…ут. Кстати, Сара, тебя это тоже касается.

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

в отдельном потоке обработку файлов делай
jenya7
Дата: 09.07.2014 10:52:51
Arm79
а что вы делаете с этими файлами?

я беру из них данные, добавляю, модифицирую.
Arm79
Дата: 09.07.2014 11:03:59
jenya7,

Оба указанных вами подхода по сути одно и тоже. Почему у вас несколько сот файлов? Вы не можете их объединить в один?

Какова специфика работы с файлами? Вы меняете данные постоянно или один раз за запуск приложения? Возможно, имеет смысл не закрывать каждый раз файлы после модификации, а держать открытыми?
jenya7
Дата: 09.07.2014 12:15:53
Arm79
jenya7,

Оба указанных вами подхода по сути одно и тоже. Почему у вас несколько сот файлов? Вы не можете их объединить в один?

Какова специфика работы с файлами? Вы меняете данные постоянно или один раз за запуск приложения? Возможно, имеет смысл не закрывать каждый раз файлы после модификации, а держать открытыми?


это CSV файлы для хранения локальных переменных и другой информации о тестах. формат я не могу менять TestStand, по крайней мере та версия которая у меня, дает две опции - таблицы в базе данных, и CSV файлы. файлы построены по строгой модели я не могу ее менять.
jenya7
Дата: 09.07.2014 12:18:39
да в дополнение - приложение чисто для удобства - допустим в 300 файлах надо поменять значение переменной - не лопатить же все руками.
Arm79
Дата: 09.07.2014 12:24:37
jenya7
таблицы в базе данных,

с базой было бы сильно проще. не думали?
jenya7
Дата: 09.07.2014 13:08:02
Arm79
jenya7
таблицы в базе данных,

с базой было бы сильно проще. не думали?


Я не только думал, я делал. В TestStand версии 4.2 с которой я работаю есть баг, который мы не смогли решить. И потом файл это довольно удобная вещь - быстро открыл, посмотрел, изменил, перебросил на другой комп, все быстро и легко. А теперь представьте что данные хранятся в таблицах и кто-нибудь захотел просмотреть их у себя на компе. Тут возникает по крайней мере три вопроса
1. Установлен у тебя MySQL?
2. Установлен у тебя MySQL Workbench?
3. Умеешь ты писать SQL Query?
ах да ну давайте еще сделаем дамп, создадим базу данных....
Arm79
Дата: 09.07.2014 13:13:20
jenya7,

Ну это ваше мнение, я его не поддерживаю, но это неважно. В контексте заданного вами вопроса ответ следующий:

1) Выносите обработку файлов в асинхрон. Вариантов много - Backgroundworker, Task, async/await, BeginInvoke и т.д.
2) Файлы держите открытыми, а не переоткрывайте каждый раз. Не забывайте Flush()
3) Если осилите, то MemoryMappedFiles, благодаря чему вы можете сразу отобразить файлы в память

Пункт 3 - это если требуется максимально быстро работать с файлами.