当我将文本行写入临时文件时,我想存储每行的文件位置以供将来随机访问。
这不起作用
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/