c#-具有FILE_FLAG_NO_BUFFERING的FileStream,其中“上次读取后的剩余数据”是或转到?

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

代码:

 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() );



        }
}

我正在尝试使用FILE_FLAG_NO_BUFFERING从文件中读取

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

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

我在上次读取的文件中收到错误“参数错误”

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

但是在例外fs.position和fs.lengh具有相同的值而与pos的值相反

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

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

谢谢:)

c# asynchronous filestream
1个回答
2
投票

您正在尝试读取32k缓冲区的长度,尽管文件本身可能要少得多。您遇到了异常,因为它是文件的结尾,并且您无法进一步读取任何内容。这就是为什么您的情况下fs.pos和fs.length相同的原因。 解决方案:将变量x值更改为fs.Lengthdata = new byte[fs.Length];...while (await fs.ReadAsync(data, 0, fs.Length) > 0)

更新实际上错误如下:

System.Reflection.MemberInfo.get_CustomAttributes不能在此上下文。

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

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