c# - 在 Metro 中查找和读取任意文件数据

标签 c# windows-8 windows-runtime file-access

我在做一些本来应该非常简单的事情时遇到了极大的麻烦:从 C# Win8 Metro 风格应用程序中的文件获取任意数据。

给定一个引用现有文件的 StorageFile 对象,我需要能够查找任意位置,然后读取任意值(各种大小的整数、字符串、字节、字节数组等)。我尝试过的没有任何效果。

例如,我使用 StorageFile.OpenAsync 获取了一个 IRandomAccessStream,用它构造了一个 DataReader,并使用了 DataReader.ReadByte 读取文件的第一个字节。但是 ReadByte 抛出异常(“操作试图访问有效范围之外的数据”)。

我对 C# 和 .NET 都比较陌生,这可能没有帮助。

有人可以概述如何做到这一点吗?


有人要求我提供代码示例。这是我上面描述的许多不同尝试之一。这些甚至可能不是正确的类型。 f 是一个有效的 StorageFile,它引用由用户选择的现有文件(因此不存在权限问题)。

public async void Read(StorageFile f)
{
  IRandomAccessStream s = await f.OpenAsynch(FileAccessMode.Read);
  DataReader r = new DataReader(s);
  Byte b = r.ReadByte();
}

ReadByte 调用是引发异常的调用。

最佳答案

这是我用来将整个文件读取为字符串的方法:

        using (var fs = await file.OpenAsync(FileAccessMode.Read))
        {
            using (var inStream = fs.GetInputStreamAt(0))
            {
                using (var reader = new DataReader(inStream))
                {
                    await reader.LoadAsync((uint)fs.Size);
                    string data = reader.ReadString((uint)fs.Size);
                    reader.DetachStream();
                    return data;
                }
            }
        }

寻找某个位置的一个明显的选择是将另一个值传递到 GetInputStreamAt() 中。要读取字节 - 您只需调用 reader.ReadBytes()。如果在这种情况下某些功能不起作用 - 可能是由 WinRT 中的错误/不完整实现引起的。我推测读取文件应该比使用 4 个不同的代理类变得简单得多,因此这可能会改变。

关于c# - 在 Metro 中查找和读取任意文件数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10640930/

相关文章:

visual-studio-2012 - Visual Studio 2012 无法创建项目

timer - 如何在 Metro Style App 中实现计时器

c# - 使用 WinRT 不引发暂停事件

c# - 在 C# MVC 的表单验证中使用外键对象

c# - 在 WINRT 应用程序中使用转换器

windows-8 - API 失败 SQLite

c# - GetNavigationState 不支持传递给 Frame.Navigate 的参数类型的序列化

c# - 使用正则表达式匹配递增/递减序列

c# - 使用 LINQ,如何将 IList<IList<object>> 转换为 IList<object>?

c# - 参数化查询后的 WebMatrix SQL 注入(inject)和 XSS 问题