ストリーム/ファイルの長さを文字数(バイトではなく)で取得するにはどうすればよいですか?ファイル/ストリームのエンコーディングが(実行時に)既知であると仮定しましょう。
ストリーム全体をメモリにロードしたくないので、使用しないでくださいTextReader.ReadToEnd()
ストリーム/ファイルの長さを文字数(バイトではなく)で取得するにはどうすればよいですか?ファイル/ストリームのエンコーディングが(実行時に)既知であると仮定しましょう。
ストリーム全体をメモリにロードしたくないので、使用しないでくださいTextReader.ReadToEnd()
エンコーディングが固定幅のもの (すべての文字のバイト数が同じ - たとえば、UTF-8 ではなく ASCII) でない限り、ファイル全体を読み取る必要がありますが、メモリ内にある必要はありません。例えば:
public long CountCharacters(TextReader reader)
{
char[] buffer = new char[8 * 1024];
long total = 0;
int charsRead;
while ((charsRead = reader.Read(buffer, 0, buffer.Length)) > 0)
{
total += charsRead;
}
return total;
}
次のように使用します。
using (var reader = File.OpenText("file.txt", Encoding.UTF8))
{
Console.WriteLine(CountCharacters(reader));
}
これは UTF-16 コード単位をカウントすることに注意してください。これは、Unicode 文字または表示可能なグリフとまったく同じではありませんが、ほとんどの場合、十分です。(文字とサロゲートペアを組み合わせる場合などを考慮してください。)
これが私がこれまでに持っているものです:
Stream stream = file.OpenRead("file.txt");
Encoding encoding = Encoding.Default; //or whatever
TextReader reader = new StreamReader(stream, encoding);
var buf = new char[4096];
long total=0;
long crt;
while ((crt = reader.Read(buf, 0, 4096)) > 0)
{
total += crt;
}
return total;
エンコーディングに依存します。固定長エンコーディングの場合は、バイト長を文字のサイズで割ります。可変長エンコーディングの場合は、ファイルが処理されるまでわかりません。