4

我一直在尝试读取文件,并计算内容的哈希以查找重复项。问题是 in Windows 8(或WinRT或 windows 商店应用程序,或者无论如何调用它,我完全感到困惑),System.IO已被替换为Windows.Storage,它的行为不同,并且非常混乱。官方文档根本没用。

首先,我需要获取一个 StorageFile 对象,在我的例子中,我是通过从文件选择器浏览文件夹获得的:

var picker = new Windows.Storage.Pickers.FolderPicker();
picker.SuggestedStartLocation = Windows.Storage.Pickers.PickerLocationId.MusicLibrary;
picker.FileTypeFilter.Add("*");
var folder = await picker.PickSingleFolderAsync();
var files = await folder.GetFilesAsync(Windows.Storage.Search.CommonFileQuery.OrderByName);

现在在文件中,我有我需要索引的文件列表。接下来,我需要打开该文件:

foreach (StorageFile file in files)
{
    var filestream = file.OpenAsync(Windows.Storage.FileAccessMode.Read);

现在是最令人困惑的部分:从文件中获取数据。文档没用,我找不到任何代码示例。显然,微软认为从相机获取照片比打开文件更重要。

文件流有一个ReadAsync我认为读取数据的成员。此方法需要一个缓冲区作为参数并返回另一个缓冲区 (???)。所以我创建了一个缓冲区:

    var buffer = new Windows.Storage.Streams.Buffer(1024 * 1024 * 10); // 10 mb should be enough for an mp3
    var resultbuffer = await filestream.ReadAsync(buffer, 1024 * 1024 * 10, Windows.Storage.Streams.InputStreamOptions.ReadAhead);

我想知道......如果文件没有足够的字节会发生什么?我没有在文档中看到任何信息。

现在我需要计算这个文件的哈希值。为此,我需要创建一个算法对象...

    var alg = Windows.Security.Criptography.Core.HashAlgorithmProvider.OpenAlgorithm("md5");
    var hashbuff = alg.HashData(resultbuffer);

    // Cleanup
    filestream.Dispose();

我也考虑过分块读取文件,但我怎样才能计算出这样的哈希值呢?我在文档中到处查看,并没有发现任何关于此的内容。它可能是带有“附加”方法的 CryptographicHash 类类型吗?

现在我有另一个问题。如何从那个奇怪的缓冲区中获取数据到字节数组?IBuffer 类没有任何“GetData”成员,并且该文档再次无用。

所以我现在能做的就是想知道宇宙的奥秘……

    // ???
}

所以问题是......我该怎么做?我完全糊涂了,我想知道为什么微软选择让读取文件如此……如此……如此……不可能!即使在组装中,我也可以比......这件事更容易理解。

4

1 回答 1

2

WinRT 或 Windows 运行时不应与 .NET 混淆,因为它不是 .NET。WinRT 只能访问 Win32 API 的子集,但不能访问 .NET 之类的所有内容。这是一篇很好的文章,介绍了 WinRT 中的规则和限制

WinRT 通常无权访问文件系统。它适用于功能,您可以允许文件访问功能,但这将限制您的应用程序仅访问某些区域。是如何通过 WinRT 进行文件访问的一个很好的示例。

于 2012-11-16T14:03:27.617 回答