我在做一些非常简单的事情时遇到了一些麻烦:在C#Win8 Metro风格的应用程序中从文件中获取任意数据。
给定一个引用现有文件的StorageFile对象,我需要能够寻找任意位置,然后读取任意值(各种大小的整数,字符串,字节,字节数组等)。我尝试过的任何东西都没有效果。
例如,我使用IRandomAccessStream
获得了StorageFile.OpenAsync
,并使用DataReader
构建了DataReader.ReadByte
,并使用ReadByte
来读取文件的第一个字节。但f
抛出异常(“操作尝试访问有效范围之外的数据”)。
我对C#和.NET都比较陌生,这可能无济于事。
有人可以概述一下如何做到这一点吗?
我被问到一个代码示例。这是我上面描述的,是许多不同尝试之一。这些甚至可能不是正确的类型。 StorageFile
是一个有效的public async void Read(StorageFile f)
{
IRandomAccessStream s = await f.OpenAsynch(FileAccessMode.Read);
DataReader r = new DataReader(s);
Byte b = r.ReadByte();
}
,它引用用户挑选的现有文件(因此没有权限问题)。
ReadByte
{{1}}调用是抛出异常的调用。
答案 0 :(得分: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种不同的代理类要简单得多,所以这可能会改变。