2015-09-19 2 views
7

StorageFolder.GetFilesAsync信じられないほど遅いです:〜3500個のファイル戻るのWindows Phone 8.0 Silverlightで StorageFolder.GetFilesAsync()よりも高速にフォルダのファイルを取得できますか?

とフォルダの

  • 〜7秒、私ははるかに高速に、CameraRollのコンテンツを取得することができました(経由MediaLibrary):ファイルの同じ量のため

    • < 1秒

    GetFilesAsyncを高速化する可能性はありますか、またはフォルダのファイルを取得するための代替方法はありますか?

    ジオタグジオタグまたはDateTakenのような情報をすぐに抽出するには写真ファイルが必要です。私のアプリケーションでSilverlightをロードした速度は、GeoPhoto - UWPに移植しようとしています。私は既にキャッシュ(ジオタグとDateTakenを画像パスでマッピング)を実装しているので、後続のアプリ開始のためにピクチャパスが必要になります。まだキャッシュされていない写真は、後で(GetFilesAsync-longの後に)表示することができますが、アプリを起動した直後にユーザーが操作できるようにすることが重要です。あなたは、この読んだ場合、私は疑問に思う

+1

あなたは 'Windows.Storage.BulkAccess'名前空間を試してみましたか? 'FileInformationFactory.GetFilesAsync'と' FileInformationFactory.GetVirtualizedFilesVector'は速いかもしれません。 –

+0

@RaymondChenは - 私はちょうど私が前にそれを使用したことがないだろうと、それは速かったかどうかを確認するために 'FileInformationFactory.GetFilesAsync'方法を試してみました...私は10500個のファイルをアップ焼いラメの例では、それは、返すために45〜60秒です'StorageFolder.GetFilesAsync'と同様です。 – WiredPrairie

+0

フォルダはインデックスされた場所(ライブラリなど)にありますか?もしそうでなければ、ディスクを叩くこと以外に選択肢はありません。また、 'GetVirtualizedFilesVector'を試しましたか?私の推測では、仮想化されたベクトルは、コンテンツを遅延的に生成できるため、仮想化されたベクトルの処理が少なくて済みます。 –

答えて

0

https://www.suchan.cz/2014/07/file-io-best-practices-in-windows-and-phone-apps-part-1-available-apis-and-file-exists-checking/

のWindows 8.1 - 最終的にはWindowsの8.1最速の方法では、新しいStorageFolder.TryGetItemAsync方法であるが、唯一の僅差で に比較するとき他の方法。ここでの主な利点は、ファイルが が存在しない場合、例外がキャッチされずに シンプルコードが必要であることです。同期方法の結果は、Windows 8 プラットフォームに似ていますが、元の同期コンテキストが必要でない場合は、 同期方法が適しています。要するに、対象のファイルが存在する場合は最速の方法はFile.ExistsでWP8とWP8.1 Silverlightの上、チェックするため、あなたがStorageFolder.GetFileAsyncを使用する必要がありますWindowsの8とWP8.1 XAML上、およびWindows 8.1使用上の

新しいメソッドStorageFolder.TryGetItemAsync。 プラットフォームでStorageFolder.GetFilesAsyncから返されたStorageFilesのうち、 の繰り返しを使用しないでください。それは非常に遅いです。また、元のスレッド に続行する必要がない場合は、WP8.1 XAML、Windows 8およびWindows 8.1プラットフォームで同期代替を使用できます。

またはこれに類するものはありますか?

StorageFolder.GetItemsAsync(UInt32, UInt32) 

最初のX個のファイルをフェッチして、ユーザーが望む即時のフィードバックを与えることができます。その後、残りの部分をロードします。

https://msdn.microsoft.com/en-us/library/windows/apps/br227287.aspx

0

EDIT:私の元の答えは有用であることがないように見えたので、私はこの1つはあなたの問題を照合することを願っています。

は、私はちょうどテストのために、〜4000個のファイルとフォルダを作成し、時間を割いてストップウォッチを使用していました。ただ、フォルダ内の各項目を読ん
は ました:

System.IO.Directory.GetFiles()0.2秒

Windows.Storage.StorageFolder.GetFilesAsync〜5.5秒

をmulitple時間と異なる順序

の両方を実行します

I understこれは文字列としてファイル名を与えるだけですが、画像を読み込むために使用するライブラリによっては、これがまだ役立つかもしれません。

オリジナル回答:
あなたは文字列としてパスを得たとき(例えばApplicationData.Current.LocalFolder.Pathから)あなたはSystem.IO.Directory.GetFiles(string path)を使用することができます。特定のオブジェクトを返しませんが、パスは文字列として返します。静的クラスSystem.IO.Fileを持つクラスを使用できます。

また、あなたが*となどのプレースホルダを使用することを可能にするのsearchPatternを、渡すことができますか?と同時に動作していますが、この方法でファイルを取得するとすばやく動作します。

+0

問題は古いだけでなく、スピードの問題がないことについて合理的にも明らかです。あなたの答えはそれにどう対処していますか? –

関連する問題