如何使用C#将整个文件读取到string?

将文本文件读入stringvariables的最快方法是什么?

我知道这可以通过几种方式完成,比如读取单个字节,然后将其转换为string。 我正在寻找一种最小编码的方法。

怎么样

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

File.ReadAllLinesStreamReader ReadLine从C#文件处理的基准比较

文件读取比较

结果。 StreamReader对于具有10,000行以上的大文件要快得多,但较小文件的差异可以忽略不计。 一如既往,计划不同大小的文件,并且只在性能不重要时才使用File.ReadAllLines。

StreamReader方法

由于File.ReadAllText方法已被其他人所build议,你也可以尝试更快 (我没有定量testing性能的影响,但它似乎比File.ReadAllText快(见下面的比较 ))。 只有在文件较大的情况下,才能看到性能差异 。

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

File.Readxxx()与StreamReader.Readxxx()的比较

通过ILSpy查看指示性代码我已经find了关于File.ReadAllLinesFile.ReadAllText的以下内容。

  • File.ReadAllText – 在内部使用StreamReader.ReadToEnd
  • File.ReadAllLines – 在内部使用StreamReader.ReadLine ,额外开销创buildList<string>作为读取行返回,并循环到文件结尾。

所以这两个方法都是在StreamReader之上构build的一个额外的便利层 。 这个方法的指示性机构就很明显了。

由ILSpy反编译的File.ReadAllText()实现

 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; } 
 string contents = System.IO.File.ReadAllText(path) 

这是MSDN文档

看看File.ReadAllText()方法

一些重要的评论:

此方法打开文件,读取文件的每一行,然后将每行添加为string的元素。 然后closures文件。 一行被定义为一个字符序列,后跟一个回车符('\ r'),一个换行符('\ n'),或者一个回车符后跟一个换行符。 生成的string不包含终止回车和/或换行符。

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

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

即使引发exception,文件句柄也保证被这个方法closures

string text = File.ReadAllText("Path"); 你有一个stringvariables的所有文本。 如果你需要单独的每一行你可以使用这个:

 string[] lines = File.ReadAllLines("Path"); 
 System.IO.StreamReader myFile = new System.IO.StreamReader("c:\\test.txt"); string myString = myFile.ReadToEnd(); 

@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() 

结果

在这里输入图像描述

在这个testing中FileStream明显更快。 StreamReader读取小文件需要额外50%的时间。 对于大文件,额外花费了27%的时间。

StreamReader专门查找换行符,而FileStream则不行。 这将占一些额外的时间。

build议

根据应用程序需要处理的数据部分,可能会有额外的parsing,这将需要额外的处理时间。 考虑一个文件具有数据列和行被CR/LF分隔的情况。 StreamReader会处理查找CR/LF的文本行,然后应用程序会执行额外的parsing来查找数据的特定位置。 (你觉得String。SubString没有价格吗?)

另一方面, FileStream以区块的forms读取数据,一个积极的开发人员可以写出更多的逻辑来使用这个数据stream。 如果所需的数据位于文件中的特定位置,那么这肯定是要保持内存使用率降低的方法。

FileStream是更好的速度机制,但会花费更多的逻辑。

如果你想从应用程序的Bin文件夹中select文件,那么你可以尝试跟随,不要忘记做exception处理。

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

那么尽可能最less的C#代码最快的方式可能是这样的:

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

对于那些觉得这个东西有趣和有趣的noobs来说,在大多数情况下( 根据这些基准 ),将整个文件读入string的最快方法是:

 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。

您可以使用 :

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

你可以这样使用

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

希望这会帮助你。

你也可以从文本文件中读取文本string,如下所示

 string str = ""; StreamReader sr = new StreamReader(Application.StartupPath + "\\Sample.txt"); while(sr.Peek() != -1) { str = str + sr.ReadLine(); } 
 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); } } } } } } 

我对一个2Mb csv的ReadAllText和StreamBuffer进行了比较,看起来差别很小,但ReadAllText似乎占用了完成函数的时间。