如何使用C#将整个文件读取到字符串?

时间:2011-09-12 11:22:49

标签: c# string file-io .net-3.5

将文本文件读入字符串变量的最快方法是什么?

我知道它可以通过多种方式完成,例如读取单个字节,然后将它们转换为字符串。我正在寻找一种编码最少的方法。

16 个答案:

答案 0 :(得分:332)

怎么样

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

答案 1 :(得分:159)

来自C# file handling

File.ReadAllLinesStreamReader ReadLine的基准比较

File Read Comparison

  

结果。对于10,000+以上的大型文件,StreamReader要快得多   行,但较小文件的差异可以忽略不计。一如既往,   计划不同大小的文件,并仅在使用File.ReadAllLines时   表现并不重要。


StreamReader方法

由于其他人建议使用File.ReadAllText方法,您也可以尝试更快(我没有定量测试性能影响,但它似乎比{{1更快) (见下面的比较))。只有在文件较大的情况下,性能difference才会显示。

File.ReadAllText


File.Readxxx()与StreamReader.Readxxx()

的比较

通过ILSpy查看指示性代码我发现了以下关于string readContents; using (StreamReader streamReader = new StreamReader(path, Encoding.UTF8)) { readContents = streamReader.ReadToEnd(); } File.ReadAllLines的内容。

  • File.ReadAllText - 内部使用File.ReadAllText
  • StreamReader.ReadToEnd - 内部也使用File.ReadAllLines,额外开销创建StreamReader.ReadLine作为读取行返回并循环到文件末尾。


因此,这两种方法都是在List<string>之上构建的附加便利层。这通过该方法的指示性主体是显而易见的。

由ILSpy反编译的

StreamReader 实施

File.ReadAllText()

答案 2 :(得分:16)

string contents = System.IO.File.ReadAllText(path)

这是MSDN documentation

答案 3 :(得分:6)

查看File.ReadAllText()方法

一些重要的评论:

  

此方法打开一个文件,读取文件的每一行,然后添加   每一行作为字符串的元素。然后它关闭文件。一条线   被定义为一个字符序列,后跟一个回车符   ('\ r'),换行符('\ n')或紧接着的回车符   通过换行。结果字符串不包含终止   回车和/或换行。

     

此方法尝试自动检测文件的编码   基于字节顺序标记的存在。编码格式为UTF-8和   可以检测到UTF-32(big-endian和little-endian)。

     

读取时使用ReadAllText(String,Encoding)方法重载   可能包含导入文本的文件,因为无法识别   可能无法正确读取字符。

     

即使这样,该方法也可以保证文件句柄被关闭   异常被提出

答案 4 :(得分:4)

@Cris抱歉。这是引用MSDN Microsoft

方法

在这个实验中,将比较两个类。将指示StreamReaderFileStream类从应用程序目录中完整地读取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是更好的速度机制,但需要更多的逻辑。

答案 5 :(得分:4)

string text = File.ReadAllText("Path");您在一个字符串变量中包含所有文本。如果您需要单独使用每一行,您可以使用:

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

答案 6 :(得分:3)

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

答案 7 :(得分:3)

最简单的方法是使用尽可能少的C#代码,这可能就是这个:

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

答案 8 :(得分:3)

如果您想从应用程序的Bin文件夹中选择文件,那么您可以尝试关注并且不要忘记进行异常处理。

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

答案 9 :(得分:3)

对于那些发现这些东西既有趣又有趣的新手,在大多数情况下(according to these benchmarks)将整个文件读成字符串的最快方法如下:

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

Put up against several other techniques,它大部分时间都胜出,包括针对BufferedReader。

答案 10 :(得分:2)

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

答案 11 :(得分:2)

你可以使用:

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

答案 12 :(得分:2)

你可以这样使用

procedure UpdateDistMsgHandler(var Msg: TMessage); message UM_UPDATEDIST;
procedure WMCopyData(var Msg : TWMCopyData) ; message WM_COPYDATA;

procedure TFrmGoogleMapsLiveUpdate.UpdateDistMsgHandler(var Msg: TMessage);
begin
   LabelDistance.Caption := IntToStr(Msg.WParam);
end;

procedure TFrmGoogleMapsLiveUpdate.WMCopyData(var Msg: TWMCopyData);
var
   lWhere    : integer;
   lLocation : string;
begin
   lWhere := Msg.CopyDataStruct.dwData;
   lLocation := String(PChar(Msg.CopyDataStruct.lpData));
   if lWhere = 0 then
      LabelVan.Caption := lLocation
   else
      LabelNaar.Caption := lLocation;
end;

希望这会对你有所帮助。

答案 13 :(得分:0)

您可以将文本文件中的文本读入字符串,如下所示

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

答案 14 :(得分:0)

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

                  }
              }
          }
      }
    }

答案 15 :(得分:0)

我对一个2Mb csv的ReadAllText和StreamBuffer进行了比较,看起来差异非常小,但ReadAllText似乎占据了完成函数所用时间的优势。