c# - 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
我在上次读取文件时收到错误“参数不正确”
- 27013 是 i 在 while 循环中最后一轮的值,在异常“参数不正确”之前
- 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。在这里查看更多信息: Reading a file with FileStream and FILE_FLAG_NO_BUFFERING
推荐阅读
- python-3.x - 以最快的方式进行串行数据通信的 Kivy 桌面应用程序
- javascript - Wordpress 如何将文本复制到剪贴板
- .htaccess - 如何从 codeigniter 中的 URL 中删除 ID 和控制器?
- python-3.x - AttributeError:“NoneType”对象在显示链表时没有属性“数据”
- lua - 在 LÖVE 中获取键盘输入时遇到问题
- anylogic - Anylogic,在给定半径内寻找代理
- html - Django:在超链接中使用图像
- react-native - 我无法使用 LAN 将我的物理 android 设备连接到 expo 客户端应用程序
- node.js - mongoose 无法连接到 docker 中的 mongodb
- python - 如何在本地和生产中拥有不同的 settings.py