首页 > 解决方案 > c# - 带有 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, 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-我设置了我将在其中读取的数组,它是 lengh = 32kb = buffer lengh

我在上次读取文件时收到错误“参数不正确”

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

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

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

谢谢 :)

标签: c#asynchronousfilestream

解决方案


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


推荐阅读