在 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
调用是引发异常的调用。
以下是我用来将整个文件读取为字符串的内容:
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 个不同的代理类简单得多,因此这可能会改变。