【问题标题】:How to read file from specific position using StreamReader in C#?如何在 C# 中使用 StreamReader 从特定位置读取文件?
【发布时间】:2017-02-12 14:01:33
【问题描述】:

我有一个文本文件,我想从一个特定的文件直到文件末尾读取这个文本文件。

我可以通过以下方式做到这一点。

string path = @"C:\abc.txt";
var pp = File.ReadAllLines(path).Skip(1).Take(2);

但我希望仅使用 StreamReader 来完成。

我正在这样做,但它没有给出正确的结果。

using (Stream stream = File.Open(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
{
        using (StreamReader streamReader = new StreamReader(stream))
        {
                var str = streamReader.ReadLine().Skip(1).Take(2);
        }
}

我也可以通过以下方式做到这一点。但我想避免 for 循环。

using (Stream stream = File.Open(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
{
    using (StreamReader streamReader = new StreamReader(stream))
    {
                int count=2;
                for (int i = 0; i < count; i++)
                {
                    streamReader.ReadLine();
                }
                string data = streamReader.ReadLine();
    }
}

我的问题根本不重复,上一个问题是关于读取所有文件,但我的问题是从特定行读取到最后。

【问题讨论】:

标签: c#


【解决方案1】:

您只需要 行 - Skip(1).Take(2) - 为什么不直接阅读它们?

  using (StreamReader streamReader = new StreamReader(stream)) {
    streamReader.ReadLine(); // skip the first line

    // take next two lines
    string[] data = new string[] {
      streamReader.ReadLine(),
      streamReader.ReadLine(),
    }; 

    ...
  }

请注意,您当前带有StreamReader 的代码等于Skip(2).Take(1).First()。在一般情况 - Skip(M).Take(N) -,您必须使用 for 循环(或它们的模拟):

   using (StreamReader streamReader = new StreamReader(stream)) {
     // Skip M first items
     for (int i = 0; i < M; ++i)
       streamReader.ReadLine();

     string[] data = new string[N];

     // Take N next items 
     for (int i = 0; i < N; ++i)
       data[i] = streamReader.ReadLine(); 
   }

【讨论】:

  • skip(m).Take(n)...m 和 n 可以是任何整数,所以我不能这样做
  • 但我想在没有循环的情况下执行此操作,因为它可以通过 File.ReadAllLines() 方法完成。所以这个解决方案的缺点是读取前 m 行是浪费内存,如果我想在 m 行之后读取
  • @vivek nuna:File.ReadAllLines() 通过使用 loops (while) 和 @ 返回所有行(顺便说一句。File.ReadLines() 在上下文中更有效)和 @ 987654332@ 也是基于 loop 的。请参阅referencesource.microsoft.com/#mscorlib/system/io/…referencesource.microsoft.com/#System.Core/System/Linq/… 以供参考。所以你可以隐藏循环,但不能消除它们
猜你喜欢
  • 1970-01-01
  • 2020-04-14
  • 2012-06-13
  • 1970-01-01
  • 2014-04-19
  • 1970-01-01
  • 2012-03-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多