寻求&在Metro中读取任意文件数据

时间:2012-05-17 17:54:51

标签: c# windows-8 windows-runtime file-access

我在做一些非常简单的事情时遇到了一些麻烦:在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}}调用是抛出异常的调用。

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