Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Windows 8中的文件IO_C#_File Io_Windows 8_Microsoft Metro_Storage - Fatal编程技术网

C# Windows 8中的文件IO

C# Windows 8中的文件IO,c#,file-io,windows-8,microsoft-metro,storage,C#,File Io,Windows 8,Microsoft Metro,Storage,我一直在尝试读取一个文件,并计算内容的散列以查找重复项。问题是,在windows8(或WinRT或windowsstore应用程序中,或者不管它叫什么,我完全搞不懂),System.IO已经被Windows.Storage所取代,它的行为不同,而且非常混乱。官方文件一点用处也没有 首先,我需要获取一个StorageFile对象,在我的例子中,我是通过从文件选择器浏览文件夹获得该对象的: var picker = new Windows.Storage.Pickers.FolderPicker()

我一直在尝试读取一个文件,并计算内容的散列以查找重复项。问题是,在
windows8
(或
WinRT
或windowsstore应用程序中,或者不管它叫什么,我完全搞不懂),
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运行时不应与.NET混淆,因为它不是.NET。WinRT只能访问Win32 API的一个子集,但不能像.NET那样访问所有内容。这里有一篇很好的文章,介绍了WinRT中存在的问题

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

请参见类似的问题:查看。这里有很多有用的例子。