c#-具有FILE_FLAG_NO_BUFFRING的FileStream,ReadAsync()可以读取小于缓冲区的任意数量的字节

问题描述 投票:0回答:1

我阅读了有关文件缓冲的本文:https://docs.microsoft.com/en-us/windows/win32/fileio/file-buffering

我读了requirements for using FILE_FLAG_NO_BUFFERING

这是我的代码:

FILE_FLAG_NO_BUFFERING

我读到:

应用程序在使用FILE_FLAG_NO_BUFFERING打开的文件时必须满足某些要求。适用以下具体要求:

文件访问大小,包括OVERLAPPED结构中的可选文件偏移,如果指定的话,必须是字节数,该字节数是卷扇区大小的整数倍。例如,如果扇区大小为512字节,则应用程序可以请求512、1,024、1,536或2,048字节的读写,但不能请求335、981或7,171字节的读写。

但是我注意到我可以读取任意数量的字节(如果它小于内部缓冲区)。

有人可以向我解释吗?

c# asynchronous filestream
1个回答
0
投票

I do使用以下代码获得预期的错误:

FileOptions nocash = (FileOptions)0x20000000;
FileStream fs;
byte[] data;

public Form1()
{
    InitializeComponent();
    fs = new FileStream(@"C:\Users\iP\Documents\visual studio 2015\Projects\ConsoleApplication32\ConsoleApplication32\bin\Debug\hello.txt", FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite, 8192, FileOptions.Asynchronous|nocash);
    data = new byte[5968];
}

private async void button1_Click(object sender, EventArgs e)
{
    await fs.ReadAsync(data,0,5968);
    byte[] ff = new byte[6] { data[5942], data[2435], data[2313], data[213], data[343], data[3698], };
    string hh = Encoding.Default.GetString(ff);
    Text = hh;
}

这给我以下错误:

using System.IO;
using System.Threading.Tasks;

namespace Demo
{
    public static class Program
    {
        static async Task Main()
        {
            int n    = 513;  // Works if this is changed to 512.
            var data = new byte[n];
            string filename = "d:\\tmp\\test.bin"; // Put your own folder here!

            File.WriteAllBytes(filename, data);

            using (var fs = new FileStream(
                filename,
                FileMode.OpenOrCreate,
                FileAccess.ReadWrite,
                FileShare.ReadWrite,
                4096,
                FileOptions.Asynchronous | (FileOptions) 0x20000000))
            {
                await fs.ReadAsync(data, 0, n);
            }
        }
    }
}

如果我将数组大小更改为512,它可以正常工作而不会出现错误(也与预期一样)。

您可以编写一个可编译的repro,在它不正确地使用不正确大小的缓冲区的情况下吗?

© www.soinside.com 2019 - 2024. All rights reserved.