我一直在尝试读取文件,并计算内容的哈希值以查找重复项.问题是在
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类类型的’append’方法吗?
现在我有另一个问题.如何从奇怪的缓冲区事件中获取数据到字节数组? IBuffer类没有任何“GetData”成员,文档也没用.
所以我现在能做的就是想知道宇宙的奥秘……
// ???
}
所以问题是……我怎么能这样做?我很困惑,我想知道微软为什么选择阅读文件……所以……所以……不可能!即使在大会中,我也能比……更容易解决这个问题.
最佳答案 WinRT或Windows Runtime不应与.NET混淆,因为它不是.NET. WinRT只能访问Win32 API的一个子集,但不能访问.NET之类的所有内容.这是一篇关于WinRT中
rules and restrictions的很好的文章.
WinRT通常无权访问文件系统.它与功能配合使用,您可以允许文件访问功能,但这会限制您的应用只能访问某些区域. Here是如何通过WinRT进行文件访问的一个很好的例子.