Как прочитать весь файл в строке с помощью С#?

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

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

Ответ 1

Как насчет

string contents = File.ReadAllText(@"C:\temp\test.txt");

Ответ 2

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

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() vs 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;
}

Ответ 4

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

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

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

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

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

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

Ответ 5

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

string[] lines = File.ReadAllLines("Path");

Ответ 6

System.IO.StreamReader myFile =
   new System.IO.StreamReader("c:\\test.txt");
string myString = myFile.ReadToEnd();

Ответ 7

@Извините. Это цитата 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, очевидно, быстрее в этом тесте. Требуется дополнительно на 50% больше времени для StreamReader, чтобы прочитать маленький файл. Для большого файла это заняло дополнительно 27% времени.

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

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

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

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

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

Ответ 8

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

string readText = System.IO.File.ReadAllText(path);

Ответ 9

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

string content = File.ReadAllText(Path.Combine(System.IO.Directory.GetCurrentDirectory(), @"FilesFolder\Sample.txt"));

Ответ 10

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

 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);
    }
}

Ответ 11

string content = System.IO.File.ReadAllText( @"C:\file.txt" );

Ответ 12

Для noobs, которые находят этот материал забавным и интересным, самый быстрый способ прочитать весь файл в строке в большинстве случаев (в соответствии с этими критериями) заключается в следующем:

using (StreamReader sr = File.OpenText(fileName))
{
        string s = sr.ReadToEnd();
}
//you then have to process the string

Однако абсолютная максимальная скорость чтения текстового файла в целом выглядит следующим образом:

using (StreamReader sr = File.OpenText(fileName))
{
        string s = String.Empty;
        while ((s = sr.ReadLine()) != null)
        {
               //do what you have to here
        }
}

Повлиять на несколько других методов, он выиграл большую часть времени, в том числе против BufferedReader.

Ответ 13

Вы можете использовать это как

public static string ReadFileAndFetchStringInSingleLine(string file)
    {
        StringBuilder sb;
        try
        {
            sb = new StringBuilder();
            using (FileStream fs = File.Open(file, FileMode.Open))
            {
                using (BufferedStream bs = new BufferedStream(fs))
                {
                    using (StreamReader sr = new StreamReader(bs))
                    {
                        string str;
                        while ((str = sr.ReadLine()) != null)
                        {
                            sb.Append(str);
                        }
                    }
                }
            }
            return sb.ToString();
        }
        catch (Exception ex)
        {
            return "";
        }
    }

Надеюсь, это поможет вам.

Ответ 14

вы можете читать текст из текстового файла в строку следующим образом

string str = "";
StreamReader sr = new StreamReader(Application.StartupPath + "\\Sample.txt");
while(sr.Peek() != -1)
{
  str = str + sr.ReadLine();
}

Ответ 15

public partial class Testfile : System.Web.UI.Page
{
    public delegate void DelegateWriteToDB(string Inputstring);
    protected void Page_Load(object sender, EventArgs e)
    {
        getcontent(@"C:\Working\Teradata\New folder");
    }

      private void SendDataToDB(string data)
    {
        //InsertIntoData
          //Provider=SQLNCLI10.1;Integrated Security=SSPI;Persist Security Info=False;User ID="";Initial Catalog=kannan;Data Source=jaya;
        SqlConnection Conn = new SqlConnection("Data Source=aras;Initial Catalog=kannan;Integrated Security=true;");
        SqlCommand cmd = new SqlCommand();
        cmd.Connection = Conn;
        cmd.CommandType = CommandType.Text;
        cmd.CommandText = "insert into test_file values('"+data+"')";
        cmd.Connection.Open();
        cmd.ExecuteNonQuery();
        cmd.Connection.Close();
    }

      private void getcontent(string path)
      {
          string[] files;
          files = Directory.GetFiles(path, "*.txt");
          StringBuilder sbData = new StringBuilder();
          StringBuilder sbErrorData = new StringBuilder();
          Testfile df = new Testfile();
          DelegateWriteToDB objDelegate = new DelegateWriteToDB(df.SendDataToDB);
          //dt.Columns.Add("Data",Type.GetType("System.String"));


          foreach (string file in files)
          {
              using (StreamReader sr = new StreamReader(file))
              {
                  String line;
                  int linelength;
                  string space = string.Empty;

                  // Read and display lines from the file until the end of 
                  // the file is reached.
                  while ((line = sr.ReadLine()) != null)
                  {
                      linelength = line.Length;
                      switch (linelength)
                      {
                          case 5:
                              space = "     ";
                              break;

                      }
                      if (linelength == 5)
                      {
                          IAsyncResult ObjAsynch = objDelegate.BeginInvoke(line + space, null, null);
                      }
                      else if (linelength == 10)
                      {
                          IAsyncResult ObjAsynch = objDelegate.BeginInvoke(line , null, null);
                      }

                  }
              }
          }
      }
    }

Ответ 16

Я сделал сравнение между ReadAllText и StreamBuffer для 2Mb csv, и казалось, что разница была довольно небольшой, но ReadAllText, казалось, взял верх от времени, затраченного на выполнение функций.