当我连接文件时,为什么字节顺序标记出现在哪里?

时间:2014-04-24 12:09:35

标签: c# .net byte-order-mark

我有一个包含XML文件的文件夹,我需要将它们合并到一个文件中。当我尝试这个时:

var allFiles = Directory.GetFiles(path, "*.xml");
String result = Path.Combine( path, "merged.xml" );
using( var stream = new FileStream( result, FileMode.Create, FileAccess.Write ) ) {
    foreach( var file in allFiles ) {
        var fileContents = File.ReadAllBytes( file );
        stream.Write( fileContents , 0, fileContents.Length );
    }
    stream.Close();
}

我看到0xEF 0xBB 0xBF(字节顺序标记)序列出现在任何两个文件内容之间的结果文件中,但不出现在文件的开头而不是文件的末尾。

如果我改为使用StreamWriter

var allFiles = Directory.GetFiles(path, "*.xml");
String result = Path.Combine( path, "merged.xml" );
using( var stream = new FileStream( result, FileMode.Create, FileAccess.Write ) ) {
    using( var writer = new StreamWriter( stream ) ) {
        foreach( var file in allFiles ) {
           var fileText = File.ReadAllText( file );
           writer.Write( fileText );
        }
    }
    stream.Close();
}

然后序列没有出现。

我是如何以二进制方式读取和写入文件并注入一些字节序列的呢?

1 个答案:

答案 0 :(得分:5)

原始文件中包含物料清单。
File.ReadAllBytes()忠实地返回那些字节,就像任何其他字节一样。

File.ReadAllText()将字节解析为UTF8,剥离BOM。