我一直在尝试读取文件,并计算内容的哈希以查找重复项。问题是 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”成员,并且该文档再次无用。
所以我现在能做的就是想知道宇宙的奥秘……
// ???
}
所以问题是......我该怎么做?我完全糊涂了,我想知道为什么微软选择让读取文件如此……如此……如此……不可能!即使在组装中,我也可以比......这件事更容易理解。