4

2つのテキストファイルを一緒に追加したいと思います。

最後にキャリッジリターンラインフィードを含むファイルが1つあります。28バイトのファイルAを観察します。

これはファイルの行です\n

次に、新しい行がなくても同じものである別のファイルがあります。26バイトのファイルBを確認します。

これはファイルの行です

同じファイル(ファイルAからA、ファイルBからB)を追加して、バイト数を比較したいと思います。

ただし、StreamReader.ReadLine()ファイルAで使用すると、値が返されますが、MSDNは次のように述べています。

行は、文字のシーケンスの後に改行( "\ n")、キャリッジリターン( "\ r")、またはキャリッジリターンの直後に改行( "\ r \ n")が続くものとして定義されます。返される文字列には、終了キャリッジリターンまたはラインフィードが含まれていません。入力ストリームの終わりに達した場合、戻り値はnullになります。

ただし、ファイルにはcrlfはありません。

最後に余分な改行を追加せずに、これらのファイルを安全に追加するにはどうすればよいですか?たとえば、StreamWriter.WriteLine()ファイルAに必要のない場合は、余分な改行を入れます。理想的なアプローチは何でしょうか?

4

4 に答える 4

3

ストリームの最後にnull電話をかけた場合にのみ取得できます。それ以外の場合は、ストリームのaまたは最後まですべてのデータを取得します。ReadLine CRLF

StreamReaderバイトごとの複製(および比較)を行おうとしている場合はStreamWriterStream通常の文字ReadとおよびWriteではなく関数。ReadLineWriteLine

を使用してファイルの内容全体を読み取り、(ではなく)ReadToEndを呼び出して書き込むこともできますが、ファイルが大きい場合は実用的ではありません。WriteWriteLine

string data;

using(StreamReader reader = new StreamReader(path))
{
    data = reader.ReadToEnd();
}

using(StreamWriter writer = new StreamWriter(path, true))
{
    writer.Write(data);
}
于 2010-08-10T02:19:08.443 に答える
2

StreamReaderとStreamWriter(TextReaderとTextWriterから派生)は、正確な形式のバイナリデータを必要とする状況には適していません。これらは、テキストや行ではなく、バイトで構成されるファイルの高レベルの抽象化です。実際、改行の数が異なるだけでなく、環境によっては、予想されるCR/LF以外のラインターミネータを書き出す場合があります。

代わりに、あるストリームから別のストリームにコピーする必要があります。これは実際には非常に簡単です。

var bytes = File.ReadAllBytes(pathIn);
var stream = File.Open(pathOut, FileMode.Append);
stream.Write(bytes, 0, bytes.Length);
stream.Close();

ファイルのサイズが潜在的に大きい場合は、入力ファイルと出力ファイルの両方を同時に開き、固定サイズのバッファーを使用して一度にブロックをコピーする必要があります。

using (var streamIn = File.Open(pathIn, FileMode.Read))
using (var streamOut = File.Open(pathOut, FileMode.Append)) {

    var bytes = new byte[BLOCK_SIZE];

    int count;
    while ((count=streamIn.Read(bytes, 0, bytes.Length)) > 0) {
        streamOut.Write(bytes, 0, count);
    }

}

また、上記のコードは、 .NET4の新機能であるStream.CopyToに置き換えることができることにも注意してください。

于 2010-08-10T02:23:39.920 に答える
2

WriteLineの代わりにStreamWriter.Writeを使用して、余分なcrlfを回避できます。

ReadLineのドキュメントに関しては、問題は不適切な表現の説明であると私は信じています。正式な行終了フラグがないという理由だけで、ファイルの最後のバイトを破棄したくないことは確かです。

于 2010-08-10T02:17:44.920 に答える
0

実装の理由によって異なります(なぜ1行ずつ読み取り、1行ずつ書き戻すのですか?)StreamWriter.Write(string)保存したすべてのテキストを使用して出力するだけで済みます。WriteLine()メソッドには、改行。

TextWriter.WriteLineメソッド(文字列)
文字列とそれに続く行末記号をテキストストリームに書き込みます。

于 2010-08-10T02:13:01.077 に答える