Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# FileStream.Seek与缓冲读取_C#_File Io - Fatal编程技术网

C# FileStream.Seek与缓冲读取

C# FileStream.Seek与缓冲读取,c#,file-io,C#,File Io,我的动机是想知道如果一个人使用了大量的FileStream.Seek(-1),幕后会发生什么 为了清楚起见,我将重新发布答案: using (var fs = File.OpenRead(filePath)) { fs.Seek(0, SeekOrigin.End); int newLines = 0; while (newLines < 3) { fs.Seek(-1, SeekOrigin.Current); newLi

我的动机是想知道如果一个人使用了大量的
FileStream.Seek(-1)
,幕后会发生什么

为了清楚起见,我将重新发布答案:

using (var fs = File.OpenRead(filePath))
{
    fs.Seek(0, SeekOrigin.End);

    int newLines = 0;
    while (newLines < 3)
    {
        fs.Seek(-1, SeekOrigin.Current);
        newLines += fs.ReadByte() == 13 ? 1 : 0; // look for \r
        fs.Seek(-1, SeekOrigin.Current);
    }

    byte[] data = new byte[fs.Length - fs.Position];
    fs.Read(data, 0, data.Length);
}
使用(var fs=File.OpenRead(filePath))
{
fs.Seek(0,SeekOrigin.End);
int换行符=0;
while(换行符<3)
{
fs.Seek(-1,SeekOrigin.Current);
换行符+=fs.ReadByte()==13?1:0;//查找\r\n
fs.Seek(-1,SeekOrigin.Current);
}
字节[]数据=新字节[fs.Length-fs.Position];
fs.Read(数据,0,数据长度);
}
就我个人而言,我会将2048字节读入一个缓冲区,并在该缓冲区中搜索字符

使用反射器,我发现该方法在内部使用

有关于windows缓存和向后读取文件的文档吗?当使用连续的
Seek(-1)
时,Windows缓冲区是否“向后”并查阅缓冲区,还是从当前位置开始向前读取


有趣的是,一方面,大多数人都同意Windows做了很好的缓存,但另一方面,“向后读取文件”的每一个答案都涉及到读取字节块并对其进行操作。

向前与向后通常没有多大区别。第一次读取后,文件数据被读取到文件系统缓存中,您将在ReadByte()上获得一个内存到内存的拷贝。只要数据在缓存中,该副本对文件指针值不敏感。不过,缓存算法的工作原理是假设您通常按顺序读取。只要文件扇区仍在同一轨道上,它就会尝试提前读取。它们通常是,除非磁盘碎片严重

但是是的,这是低效的。每个字节都有两个pinvoke和API调用。这里面有相当大的开销,同样的两个调用也可以用同样的开销读取,比如说,65千字节。像往常一样,只有当您发现它是性能瓶颈时才修复它。

这里有一个指针

该行为还可能取决于文件的物理位置(硬盘、网络等)以及本地配置/优化

另一个重要的信息来源是CreateFile API文档:


有一个名为“缓存行为”的好章节,它至少告诉我们您如何影响文件缓存,至少在非托管世界中是这样。

Ah,没有考虑p/调用的成本。这已经足够让我们分块阅读了。做一些认真的同行评议吧?@ChaosPandion:我没有给你的评论打分,我只是好奇而已。