私たちのアプリケーションのスクリプト エディターに読み込まれる大きなファイルを処理する方法を考え出すという素敵な仕事があります (クイック マクロ用の内部製品のVBAのようなものです)。ほとんどのファイルは約 300 ~ 400 KB で、読み込みは問題ありません。しかし、100 MB を超えると、(ご想像のとおり) 処理が困難になります。
何が起こるかというと、ファイルが読み取られて RichTextBox に押し込まれ、ナビゲートされます。この部分についてはあまり心配する必要はありません。
最初のコードを書いた開発者は、単純に StreamReader を使用して実行しています。
[Reader].ReadToEnd()
完了するまでにかなりの時間がかかる可能性があります。
私の仕事は、このコードを分割し、チャンクでバッファに読み込み、キャンセルするオプションを含むプログレスバーを表示することです。
いくつかの仮定:
- ほとんどのファイルは 30 ~ 40 MB になります
- ファイルの内容はテキスト (バイナリではない) で、一部は Unix 形式、一部は DOS 形式です。
- コンテンツが取得されたら、どのターミネータが使用されているかを調べます。
- リッチテキストボックスでレンダリングするのにかかる時間が読み込まれると、誰も心配しません。これは、テキストの初期ロードにすぎません。
質問は次のとおりです。
- StreamReader を使用して、Length プロパティ (ProgressMax など) をチェックし、設定されたバッファー サイズの Read を発行し、バックグラウンド ワーカー内で while ループを反復処理して、メイン UI スレッドをブロックしないようにすることはできますか? 完了したら、stringbuilder をメイン スレッドに戻します。
- コンテンツは StringBuilder に送られます。長さが利用可能な場合、ストリームのサイズで StringBuilder を初期化できますか?
これらは (あなたの専門的な意見では) 良いアイデアですか? Streams からコンテンツを読み取る際に、常に最後の数バイトか何かが失われるため、過去にいくつかの問題がありましたが、その場合は別の質問をします。