带有FILE_FLAG_NO_BUFFERING的FileStream,或者“最后一次读取后的剩余数据”在哪里?

代码:

 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,x) > 0)
            {
                i++;
                if (i == 27013)
                {
                    pos = fs.Length - fs.Position;
                }
            }
        }
        catch (Exception ex)
        {

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



        }
}

我正在尝试使用FILE_flaG_NO_BUFFERING读取文件

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

2-我设置了要读取的数组,长度= 32kb =缓冲区长度

最后一次读取文件时出现错误“参数错误”

  • 27013是我在异常“参数错误”之前的上一轮while循环中的值
  • pos = 19123->文件中的剩余字节

但是在异常fs.position和fs.lengh具有相同的值之后,却与pos的值相反

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

或者有一种方法可以读取文件中的剩余字节??

谢谢:)

sdzsd999 回答:带有FILE_FLAG_NO_BUFFERING的FileStream,或者“最后一次读取后的剩余数据”在哪里?

您试图读取32k缓冲区的长度,尽管文件本身可能要少得多。您遇到了异常,因为它是文件的结尾,并且您无法进一步读取任何内容。这就是为什么您的情况下fs.pos和fs.length相同的原因。
解决方案:
将变量echo '<pre>';print_r($data); die;的值更改为x

fs.Length
data = new byte[fs.Length];
...

更新
实际上,错误如下:

  

System.Reflection.MemberInfo.get_CustomAttributes不能在   这种情况。

原来,标志FILE_FLAG_NO_BUFFERING不被支持。在此处查看更多信息: Reading a file with FileStream and FILE_FLAG_NO_BUFFERING

本文链接:https://www.f2er.com/3095750.html

大家都在问