Нет, сейчас нет. Это потенциальная РСЕ, создать для нее хиру?
Что ж, вы всегда можете использовать FileSystemWatcher , чтобы сообщать вам событие, когда файл изменился, таким образом, вы сканируете файл только по требованию.
Если строка текста всегда будет одинаковой, то использование RegEx для сопоставления с текстом строки, вероятно, более эффективно, чем циклический просмотр файла для сопоставления текста с использованием String.Equals ( ) или ==.
Тем не менее, я не знаю, в любом случае в c # найти текст в файле без открытия файла в память и чтения строк.
Эта ссылка хороший учебник по использованию RegEx для сопоставления строк в файле с использованием c #.
Если они не очень длинные строки, в современных вычислительных терминах 1600 строк - это не много! Файл ввода-вывода будет обрабатываться средой выполнения и буферизироваться, и он будет удивительно быстрым, а объем памяти - поразительно непримечательным.
Просто прочитайте файл построчно или используйте System.IO.File. ПрочтитеAllLines ()
, а затем посмотрите, существует ли линия, например, используя сравнение всей строки со строкой.
Это не будет вашим узким местом.
Ваше узкое место может возникнуть, если вы часто выполняете опрос и / или использование регулярных выражений без необходимости. Лучше всего использовать средство наблюдения за файловой системой, чтобы вообще не анализировать файл, если он не изменился.
List<String> lines = System.IO.File.ReadAllLines(file).ToList()
lines.Contains("foo");
Вы можете просто зациклить строки следующим образом:
String line;
while ((line = file.ReadLine()) != null)
{
if (line matches regex blah)
return true;
}
return false;
Метод ReadLine загружает в память только одну строку файла, а не весь файл. Когда цикл запускается снова, единственная ссылка на эту строку теряется, и поэтому при необходимости эта строка будет собираться мусором.
Я хотел бы объединить пару методов, используемых здесь:
1). Установите FileSystemWatcher для файла. Установите необходимые фильтры для предотвращения ложных срабатываний. Вы не хотите проверять файл без необходимости.
2). Когда FSW вызывает событие, захватите содержимое, используя строку fileString = File.ReadAllLines ().
3). Используйте простое регулярное выражение, чтобы найти соответствие для вашей строки.
4). Если совпадение имеет индекс больше -1, то файл содержит строку с любым значением в индексе.
Вы успешно избежали необходимости разбирать файл построчно, у вас есть потенциально загружал большой объем данных (хотя 1600 строк текста вряд ли так много) в память. Когда строковый литерал выходит из области видимости, он '
Это действительно зависит от вашего определения «эффективный».
Если вы имеете в виду «эффективный для памяти», то вы можете использовать потоковый считыватель так, чтобы у вас была только одна строка текста в памяти на время, к сожалению, это медленнее, чем загрузка всего объекта сразу, и может заблокировать файл.
Если вы имеете в виду в кратчайшие сроки, то это задача, которая получит большие преимущества от параллельной архитектуры. Разделите файл на куски и передайте каждый кусок другому потоку для обработки. Конечно, это не особенно эффективно для процессора, так как это может привести к высокой загрузке всех ваших ядер.
Если вы хотите просто выполнить наименьшее количество работы, есть ли что-нибудь, что вы уже знаете о файле? Как часто это будет обновляться? Первые 10 символов в каждой строке всегда одинаковы? Если вы смотрели 100 строк в прошлый раз, вам нужно повторно сканировать эти строки? Любое из них может создать огромную экономию как времени, так и использования памяти.
В конце концов, хотя волшебной палочки нет, и поиск файла - это (в худшем случае) операция O (n).
Извините, просто перечитайте это, и это может показаться саркастическим, и я не хочу, чтобы это было так. Я просто хотел подчеркнуть, что любые выгоды, которые вы получаете в одной области, скорее всего, будут потеряны в других местах, и термин «эффективный» - это весьма неоднозначный термин в подобных обстоятельствах.