文件流与FILE_FLAG_NO_BUFFERING,"the remaining data after last read"在哪里或去哪里?



代码:

FileOptions nocash = (FileOptions)0x20000000;
FileStream fs;
byte[] data;
int x = 32 * 1024;

public Form1()
{
InitializeComponent();
fs = new FileStream(@"C:UsersiPDocumentsvisual studio 2015ProjectsConsoleApplication32ConsoleApplication32binDebughello.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-i将内部缓冲区设置为32kb

2-我设置了我将在其中读取的数组,它的长度=32kb=缓冲区长度

我在最后一次读取文件时得到错误"参数不正确">

  • 27013是异常"参数不正确"之前while循环中最后一个循环中i的值
  • pos=19123->文件中的剩余字节

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

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

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

谢谢:(

尽管文件本身可能要小得多,但您正在尝试使用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。查看此处了解更多信息:使用FileStream和file_FLAG_NO_BUFFERING 读取文件

最新更新