私はファイルを読み、内容のハッシュを計算して重複を見つけようとしています。問題は、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);
今が最も紛らわしい部分です:ファイルからデータを取得します。ドキュメントは役に立たず、コード例も見つかりませんでした。どうやら、Microsoftは、ファイルを開くよりもカメラから写真を取得することが重要だと考えていたようです。
ファイルストリームには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();
ファイルをチャンクで読み取ることも検討しましたが、そのようなハッシュを計算するにはどうすればよいですか?私はドキュメントのいたるところを調べましたが、これについては何も見つかりませんでした。'append'メソッドを持つCryptographicHashクラスタイプでしょうか?
今、私は別の問題を抱えています。その奇妙なバッファからバイト配列にデータを取得するにはどうすればよいですか?IBufferクラスには「GetData」メンバーがなく、ドキュメントも役に立ちません。
だから今私にできることは、宇宙の謎について疑問に思うことだけです...
// ???
}
だから問題は...どうすればこれを行うことができますか?私は完全に混乱しています、そしてなぜマイクロソフトがファイルを読むことを選んだのか疑問に思います...そう...そう...不可能です!アセンブリでさえ、私はそれをより簡単に理解することができました....これ。