我在做一些本来应该非常简单的事情时遇到了极大的麻烦:从 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/