c# - 在 C# 中,如何获取输出文件中每个文本行的文件位置(在写入时)?

标签 c# .net

当我将文本行写入临时文件时,我想存储每行的文件位置以供将来随机访问。

这不起作用

 StreamWriter outFile;

 { ...
          fPos[i++] = outFile.BaseStream.Position;
 }

上述循环中的 fPos 值为 0,0,0,...,1024,1024,...2028,2048 等 - 即实际位置。

以下方法确实有效,但消除了缓冲:

 { ...
          outFile.Flush();
          fPos[i++] = outFile.BaseStream.Position;
 }

有没有更好的方法可以在不放弃缓冲的情况下获取(逻辑)文件位置?

最佳答案

如果数据足够小,可以放入内存,您可以将 StreamWriter 写入 MemoryStream。在每行之后刷新,并在写入每行之前获取内存流的位置。当您将数据写入内存流后,将其复制到文件中。

如果数据大于内存所能容纳的大小,您可以使用MemoryStream作为缓冲区,并在内存流填满时将其刷新到磁盘文件。这需要做一点簿记,但也不会太糟糕。

稍微复杂一点的是创建您自己的从 BufferedStream 派生的类,该类对写入其中的字节进行计数。打开缓冲区大小为 0 的流写入器,并将其写入缓冲流。然后,您可以查询缓冲流以获取写入的字节数。当然,该流将写入文件流。所以它会是这样的:

using (var fs = new FileStream(...))
{
    using (var buff = new CustomBufferedStream(fs))
    {
        using (var writer = new StreamWriter(buff, encoding))
        {
            ... do your output here
        }
    }
}

您可能无法将 StreamWriter 缓冲区大小设置为 0。如果是这种情况,那么您必须在每一行之后刷新,并且您可能必须覆盖自定义流的 Flush 方法,这样就不会自动刷新到磁盘文件。我不记得 StreamWriter.Flush 是否自动调用 BaseStream.Flush

关于c# - 在 C# 中,如何获取输出文件中每个文本行的文件位置(在写入时)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18319569/

相关文章:

c# - .ctor 是不明确的,因为类中存在多种具有此名称的成员

c# - Kinect 脸部追踪手势

c# - 分配 Session 变量/值时出现 NullReferenceException

c# - C# 中类初始值设定项之间的区别?

c# - 如何使属性真正只读?

c# - 在不调用 ToString() 的情况下将 StringBuilder 的内容写入文件

c# - 无法使用 Visual Studio 2015 RC 在 Windows 8.1+ 通用应用程序中打开 Windows Phone 项目

c# - 从 Microsoft Chart 控件获取鼠标单击事件单击数据标记

c# - 基于 .Net 中的字段反序列化 json (C#)

c# - 如何替换2个文件?