Как прочитать весь файл в строку с помощью C #? - PullRequest
187 голосов
/ 12 сентября 2011

Какой самый быстрый способ прочитать текстовый файл в строковую переменную?

Я понимаю, что это можно сделать несколькими способами, например, прочитать отдельные байты, а затем преобразовать их в строку. Я искал метод с минимальным кодированием.

Ответы [ 16 ]

338 голосов
/ 12 сентября 2011

Как насчет

string contents = File.ReadAllText(@"C:\temp\test.txt");
159 голосов
/ 12 сентября 2011

Сравнительное сравнение File.ReadAllLines против StreamReader ReadLine из Обработка файлов C #

File Read Comparison

Результаты. StreamReader намного быстрее для больших файлов с 10 000+ линий, но разница для небольших файлов незначительна. Как всегда, планировать различные размеры файлов и использовать File.ReadAllLines только тогда, когда производительность не критична.


StreamReader подход

Поскольку подход File.ReadAllText был предложен другими, вы также можете попробовать быстрее (Я не тестировал количественно влияние на производительность, но, похоже, оно быстрее, чем File.ReadAllText (см. сравнение ниже)). Разница в в производительности будет видна только в случае больших файлов.

string readContents;
using (StreamReader streamReader = new StreamReader(path, Encoding.UTF8))
{
     readContents = streamReader.ReadToEnd();
}


Сравнение File.Readxxx () и StreamReader.Readxxx ()

Просмотр индикативного кода через ILSpy Я обнаружил следующее о File.ReadAllLines, File.ReadAllText.

  • File.ReadAllText - использует StreamReader.ReadToEnd внутри
  • File.ReadAllLines - также использует StreamReader.ReadLine внутри с дополнительными накладными расходами на создание List<string> для возврата в виде строк чтения и циклического выполнения до конца файла.


Таким образом, оба метода представляют собой дополнительный уровень удобства , построенный поверх StreamReader. Это видно по показательности метода.

File.ReadAllText() реализация, декомпилированная ILSpy

public static string ReadAllText(string path)
{
    if (path == null)
    {
        throw new ArgumentNullException("path");
    }
    if (path.Length == 0)
    {
        throw new ArgumentException(Environment.GetResourceString("Argument_EmptyPath"));
    }
    return File.InternalReadAllText(path, Encoding.UTF8);
}   

private static string InternalReadAllText(string path, Encoding encoding)
{
    string result;
    using (StreamReader streamReader = new StreamReader(path, encoding))
    {
        result = streamReader.ReadToEnd();
    }
    return result;
}
16 голосов
/ 12 сентября 2011
string contents = System.IO.File.ReadAllText(path)

Вот документация MSDN

6 голосов
/ 12 сентября 2011

Взгляните на File.ReadAllText () метод

Некоторые важные замечания:

Этот метод открывает файл, читает каждую строку файла, а затем добавляет каждая строка как элемент строки. Затем он закрывает файл. Линия определяется как последовательность символов, за которой следует возврат каретки ('\ r'), перевод строки ('\ n') или возврат каретки сразу после переводом строки. Результирующая строка не содержит завершающей возврат каретки и / или перевод строки.

Этот метод пытается автоматически определить кодировку файла на основе наличия меток порядка следования байтов. Форматы кодирования UTF-8 и UTF-32 (с прямым и обратным порядком байтов) может быть обнаружен.

Используйте перегрузку метода ReadAllText (String, Encoding) при чтении файлы, которые могут содержать импортированный текст, потому что нераспознанные символы могут быть прочитаны неправильно.

Дескриптор файла гарантированно будет закрыт этим методом, даже если Возникают исключения

4 голосов
/ 29 марта 2013

string text = File.ReadAllText("Path"); у вас есть весь текст в одной строковой переменной.Если вам нужна каждая строка отдельно, вы можете использовать это:

string[] lines = File.ReadAllLines("Path");
4 голосов
/ 29 марта 2013

@ Крис, прости. Это цитата MSDN Microsoft

Методология

В этом эксперименте будут сравниваться два класса. Классы StreamReader и FileStream будут направлены на чтение двух файлов по 10K и 200K в полном объеме из каталога приложения.

StreamReader (VB.NET)

sr = New StreamReader(strFileName)
Do
  line = sr.ReadLine()
Loop Until line Is Nothing
sr.Close()

FileStream (VB.NET)

Dim fs As FileStream
Dim temp As UTF8Encoding = New UTF8Encoding(True)
Dim b(1024) As Byte
fs = File.OpenRead(strFileName)
Do While fs.Read(b, 0, b.Length) > 0
    temp.GetString(b, 0, b.Length)
Loop
fs.Close()

Результат

enter image description here

FileStream явно быстрее в этом тесте. StreamReader требуется на 50% больше времени для чтения маленького файла. Для большого файла это заняло дополнительно 27% времени.

StreamReader специально ищет разрывы строк, а FileStream - нет. Это будет учитывать дополнительное время.

Рекомендации

В зависимости от того, что приложение должно делать с разделом данных, может потребоваться дополнительный анализ, который потребует дополнительного времени обработки. Рассмотрим сценарий, в котором в файле есть столбцы данных, а строки CR/LF разделены. StreamReader будет обрабатывать строку текста в поисках CR/LF, а затем приложение будет выполнять дополнительный анализ в поисках определенного местоположения данных. (Вы думали, что String. SubString поставляется без цены?)

С другой стороны, FileStream считывает данные порциями, и активный разработчик может написать немного больше логики, чтобы использовать поток для своей выгоды. Если необходимые данные находятся в определенных позициях в файле, это, безусловно, путь, так как он уменьшает использование памяти.

FileStream - лучший механизм для скорости, но потребует больше логики.

3 голосов
/ 31 марта 2015

вы можете использовать:

 public static void ReadFileToEnd()
{
    try
    {
    //provide to reader your complete text file
        using (StreamReader sr = new StreamReader("TestFile.txt"))
        {
            String line = sr.ReadToEnd();
            Console.WriteLine(line);
        }
    }
    catch (Exception e)
    {
        Console.WriteLine("The file could not be read:");
        Console.WriteLine(e.Message);
    }
}
3 голосов
/ 09 июня 2014

Если вы хотите выбрать файл из папки Bin приложения, вы можете попробовать выполнить следующие действия и не забудьте выполнить обработку исключений.

string content = File.ReadAllText(Path.Combine(System.IO.Directory.GetCurrentDirectory(), @"FilesFolder\Sample.txt"));
3 голосов
/ 12 сентября 2011

Ну, самый быстрый способ, подразумевающий наименьший возможный код C #, вероятно, такой:

string readText = System.IO.File.ReadAllText(path);
3 голосов
/ 12 сентября 2011
System.IO.StreamReader myFile =
   new System.IO.StreamReader("c:\\test.txt");
string myString = myFile.ReadToEnd();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...