Windows RT IRandomAccessStream 接口会在读过文件结尾时报告无效位置
2012-06-03 09:25
316 查看
Windows 运行时 IRandomAccessStream 接口会在读过文件结尾时报告无效位置
将 Windows 随机访问流 (IRandomAccessStream) 转换为托管流时,托管流将默认使用一个缓冲区。当文件中的最后一个字节填充到缓冲区中时,该缓冲区会读过文件结尾并报告位置不正确。此问题影响使用该位置的所有代码;例如,当您使用 System.IO.Compression.ZipArchive 类从 Windows 运行时流读取数据时,就会出现这种情况。
问题发生位置示例:
Windows.Storage.Pickers.FileOpenPicker fop = new Windows.Storage.Pickers.FileOpenPicker();
fop.FileTypeFilter.Add(".zip");
StorageFile file = await fop.PickSingleFileAsync();
using (System.IO.Stream s = await file.OpenStreamForReadAsync())
{
using (var za = new System.IO.Compression.ZipArchive(s))
{
foreach (var entry in za.Entries) // Fails here.... // Do something here
{
}
}
}
解决此问题的方法:
使用长度为零的缓冲区打开流。调用 file.OpenReadAsync() 而非 file.OpenStreamForReadAsync() 方法,然后对生成的 Windows 运行时流调用 AsStreamForRead(0)。
例如:
using (var ws = await file.OpenReadAsync())
{
using (var s = ws.AsStreamForRead(0))
{
using (var za = new System.IO.Compression.ZipArchive(s)) // This will now work correctly.
{
// Do something here
}
}
}
将 Windows 随机访问流 (IRandomAccessStream) 转换为托管流时,托管流将默认使用一个缓冲区。当文件中的最后一个字节填充到缓冲区中时,该缓冲区会读过文件结尾并报告位置不正确。此问题影响使用该位置的所有代码;例如,当您使用 System.IO.Compression.ZipArchive 类从 Windows 运行时流读取数据时,就会出现这种情况。
问题发生位置示例:
Windows.Storage.Pickers.FileOpenPicker fop = new Windows.Storage.Pickers.FileOpenPicker();
fop.FileTypeFilter.Add(".zip");
StorageFile file = await fop.PickSingleFileAsync();
using (System.IO.Stream s = await file.OpenStreamForReadAsync())
{
using (var za = new System.IO.Compression.ZipArchive(s))
{
foreach (var entry in za.Entries) // Fails here.... // Do something here
{
}
}
}
解决此问题的方法:
使用长度为零的缓冲区打开流。调用 file.OpenReadAsync() 而非 file.OpenStreamForReadAsync() 方法,然后对生成的 Windows 运行时流调用 AsStreamForRead(0)。
例如:
using (var ws = await file.OpenReadAsync())
{
using (var s = ws.AsStreamForRead(0))
{
using (var za = new System.IO.Compression.ZipArchive(s)) // This will now work correctly.
{
// Do something here
}
}
}
相关文章推荐
- 编写一个程序,使其从标准输入读取字符,直到遇到文件结尾。对美个字符 程序需要检查并报告改字符是否是一个字母。如果是报告字母在字符表中的位置,否则返回-1
- Byte[],Stream,Ibuffer,IRandomAccessStream等之间的互相转换(rt,8.1可用,部分Sliverlight 8.1可用)
- Windows 服务器使用FTP出现“当前的安全设置不允许从该位置下载文件" 警告
- 删除windows文件右击打开方式中的无效程序选项
- RandomAccessFile任意访问文件的位置
- .NET 控制Windows文件和目录访问权限研究(FileSystemAccessRule)
- 通过GetManifestResourceStream加载文件出现错误提示“null值”对于“stream”无效
- Windows 7 运行VS2015编译的软件提示缺少ucrtbased.dll文件的解决办法
- Windows下使用标准Shell接口遍历文件和文件夹(1)
- Windows 之 删除文件出现“该项目不在请确认该项目的位置”
- windows操作系统的自动更新文件下载的位置
- Mybatis中接口和对应的mapper文件位置配置深入剖析
- Windows文件检索之——接口设计
- 关于Rational DOORS Web Access的日志文件存放位置
- caffe for windows的python接口学习(3):生成以原始图片作为输入的配置文件
- Mybatis中接口和对应的mapper文件位置详解
- Windows环境下redis 配置文件中设置的密码为什么无效
- Windows下ftp拷贝出现 "当前的安全设置不允许从该位置下载文件" 警告
- Windows启动配置数据(BCD)存储文件包含一些无效信息
- windows的host文件的位置和作用