Windows RT IRandomAccessStream 接口会在读过文件结尾时报告无效位置

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

         }

      }

   }

转载于:https://www.cnblogs.com/onthewayjay/archive/2012/06/03/2532531.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
rt-thread中查找以指定字符串开头和结尾文件,可以通过以下步骤实现: 1. 使用dfs_dir函数遍历指定路径下的所有文件,dfs_dir函数调用用户定义的回调函数来处理每个文件。 2. 在回调函数中,可以使用strnlen函数获取当前文件名的长度。 3. 然后再使用strncmp函数分别比较当前文件名的开头和结尾是否与指定的字符串相同。 4. 如果同满足开头与结尾匹配,将该文件名加入到列表中。 5. 遍历完所有文件后,返回找到的文件列表。 下面是一个简单的示例代码: ```c #include <dfs_posix.h> /* 定义回调函数 */ static int find_callback(void *arg, const char *path) { char *name = rt_strdup(path); char *ext = rt_strrchr(name, '.'); if (ext) { /* 检查开头和结尾是否与指定字符串相同 */ if (strncmp(name, (char *)arg, strlen((char *)arg)) == 0 && strncmp(ext, ".txt", 4) == 0) { /* 将文件名加入到列表中 */ rt_kprintf("Found file: %s\n", path); } } rt_free(name); return 0; } void find_files(const char *path, const char *prefix) { rt_kprintf("Searching files in \"%s\" with prefix \"%s\"...\n", path, prefix); /* 遍历指定路径下的所有文件,并调用回调函数处理每个文件 */ dfs_dir(path, find_callback, (void *)prefix, O_RDONLY); } int main(void) { /* 查找文件 */ find_files("/", "test"); return 0; } ``` 在这个示例中,我们使用了rt_strdup和rt_free函数来创建和释放文件名的副本,以便于字符串操作。同,我们也使用了rt_strrchr函数来查找文件名的扩展名,并使用rt_kprintf函数打印出找到的文件名。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值