2

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

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

例如,我获得了一个IRandomAccessStreamusing StorageFile.OpenAsync,用它构造了一个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调用是引发异常的调用。

4

1 回答 1

4

这是我用来将整个文件作为字符串读取的内容:

        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 个不同的代理类更简单,所以这可能会改变。

于 2012-05-17T20:46:22.827 回答