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

本文关键字:任意 文件 数据 读取 Metro 查找 | 更新日期: 2023-09-27 18:34:35

我在做一些应该非常简单的事情时遇到了很多麻烦:从 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调用是引发异常的调用。

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

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

        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((。要读取字节 - 您只需调用读取器。读取字节((。如果某些内容在此方案中不起作用 - 则可能是由 WinRT 中的错误/不完整实现引起的。我推测读取文件应该比使用 4 个不同的代理类简单得多,因此这可能会改变。