代码:
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 =缓冲区长度
我在上次读取的文件中收到错误“参数错误”
但是在例外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。在此处查看更多信息:Reading a file with FileStream and FILE_FLAG_NO_BUFFERING