c#-具有文件"U标志"U否"缓冲的FileStream,其中「;上次读取后的剩余数据;是去还是不去?

c#-具有文件"U标志"U否"缓冲的FileStream,其中「;上次读取后的剩余数据;是去还是不去?,c#,asynchronous,filestream,C#,Asynchronous,Filestream,代码: 我正在尝试读取带有文件\u标志\u无缓冲区的文件 1-我将内部缓冲区设置为32kb 2-我设置了我将在其中读取的数组,它是lengh=32kb=buffer lengh 我在上次读取的文件中得到错误“参数不正确” 27013是在异常“参数不正确”之前的while循环中最后一次循环中的i值 pos=19123->文件中的剩余字节 但异常后fs.position和fs.lengh的值相同,而pos的值相反 我的问题是:pos和fs.position之间的数据在哪里 或者有办法读取文件中的

代码:

我正在尝试读取带有文件\u标志\u无缓冲区的文件

1-我将内部缓冲区设置为32kb

2-我设置了我将在其中读取的数组,它是lengh=32kb=buffer lengh

我在上次读取的文件中得到错误“参数不正确”

  • 27013是在异常“参数不正确”之前的while循环中最后一次循环中的i值
  • pos=19123->文件中的剩余字节
但异常后fs.position和fs.lengh的值相同,而pos的值相反

我的问题是:pos和fs.position之间的数据在哪里

或者有办法读取文件中的剩余字节

谢谢:)

您正在尝试使用32k缓冲区的长度进行读取,尽管文件本身可能要少得多。您遇到异常是因为它是文件的结尾,您无法进一步读取。这就是为什么在您的情况下fs.pos和fs.length是相同的
解决方案:
将变量
x
值更改为
fs.Length


data=新字节[fs.Length]

while(等待fs.ReadAsync(数据,0,fs.Length)>0)

更新
实际上,错误如下:

无法在中调用System.Reflection.MemberInfo.get\u CustomAttributes 这个背景

结果是不支持标志文件\u flag\u NO\u缓冲。查看此处了解更多信息:

是的,是的,我知道,但我使用的是文件标志缓冲,它有读取数据的要求,其中一个要求是“我必须读取的字节数是卷扇区大小的倍数,请检查此项,因此我只能读取除(512、102420484096)以外的任何数字”
 FileOptions nocash = (FileOptions)0x20000000;
    FileStream fs;
    byte[] data;
    int x = 32 * 1024;


    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, x, FileOptions.Asynchronous|nocash);

        data = new byte[x];


    }

    private void Form1_Load(object sender, EventArgs e)
    {

    }

    private async void button1_Click(object sender, EventArgs e)
    {


        int i = 0;
        double pos = 0;



        try
        {


            while (await fs.ReadAsync(data, 0, x) > 0)
            {
                i++;
                if (i == 27013)
                {
                    pos = fs.Length - fs.Position;
                }
            }
        }
        catch (Exception ex)
        {

            textBox2.AppendText(pos.ToString()+"    "+fs.Position.ToString() + "    "+fs.Length.ToString() );



        }
}