1

LoadFileを使用せずにファイルをRichTextBoxに読み込みたい(進行状況を表示したい場合があります)。ファイルにはASCII文字のみが含まれています。

私はファイルをチャンクで読み取ることを考えていました。

私は次のことをしました(これは機能しています):

const int READ_BUFFER_SIZE = 4 * 1024;

BinaryReader reader = new BinaryReader(File.Open("file.txt", FileMode.Open));

byte[] buf = new byte[READ_BUFFER_SIZE];
do {
    int ret = reader.Read(buf, 0, READ_BUFFER_SIZE);
    if (ret <= 0) {
        break;
    }

    string text = Encoding.ASCII.GetString(buf);
    richTextBox.AppendText(text);
} while (true);

私の懸念は:

string text = Encoding.ASCII.GetString(buf);

byte[]RichTextBoxにを追加することはできません。

私の質問は次のとおりです。

  • 読み取られるすべてのチャンクに新しい文字列オブジェクトが割り当てられますか?

  • RichTextBoxにテキストを追加するためだけに文字列オブジェクトを作成する必要がないより良い方法はありませんか?

  • または、ファイル(StreamReader.ReadLine)から行を読み取り、返された文字列をRichTextBoxに追加する方が効率的ですか?

4

3 に答える 3

2

読み取られるすべてのチャンクに新しい文字列オブジェクトが割り当てられますか?

はい。

RichTextBoxにテキストを追加するためだけに文字列オブジェクトを作成する必要がないより良い方法はありませんか?

いいえ、AppendTextには文字列が必要です

または、ファイル(StreamReader.ReadLine)から行を読み取り、返された文字列をRichTextBoxに追加する方が効率的ですか?

いいえ、それはかなり効率が悪いです。これで、新しい文字列オブジェクトをより頻繁に作成できるようになります。ガベージコレクションヒープの観点からは問題ありませんが、これ以上ガベージを作成することはありません。しかし、それはRichTextBoxの絶対的な殺人であり、常に独自のバッファーを再割り当てする必要があります。これには、以前に読んだすべてのテキストの移動が含まれます。あなたが持っているものはすでに良いです、あなたはただはるかに大きなREAD_BUFFER_SIZEを使うべきです。

残念ながら、ここには相反する目標があります。バッファを39,999バイトより大きくしたくない場合、または文字列がラージオブジェクトヒープに入れられて、第2世代のガベージコレクションが発生するまでそれを詰まらせたくない場合。ただし、ファイルが大きすぎてプログレスバーが必要な場合のメガバイトのように、そのサイズを大幅に超えると、RTBははるかに幸せになります。

本当に効率的にしたい場合は、RichTextBox.LoadFile()を置き換える必要があります。基になるWindowsメッセージはEM_STREAMINであり、コールバックメカニズムを使用してテキストをストリーミングします。技術的には、コールバックを置き換えて、RichTextBoxでデフォルトのコールバックを実行し、さらに進行状況バーを更新することができます。それは文字列を取り除くことを許可します。ピンボークはかなり不親切です。ガイダンスとしてリファレンスソースを使用してください。

最初に簡単なルートを取り、バッファサイズを増やします。コードがFile.ReadAllText()を使用するよりもかなり遅い場合にのみ、pinvokeルートの使用を検討してください。

于 2013-02-08T08:20:31.917 に答える
1

これを試して:

richTextBox.AppendText(File.ReadAllText("file.txt"));

また

richTextBox.AppendText(File.ReadAllText("file.txt", Encoding.ASCII));
于 2013-02-07T18:50:09.627 に答える
0

StreamReaderを使用できます。次に、ファイルの各行を読み取り、読み取り中に進行状況を表示できます。

于 2013-02-08T07:48:31.447 に答える