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