C# 为什么在连接文件时,字节顺序标记会突然出现?
我有一个包含XML文件的文件夹,我需要将它们合并到一个文件中。当我尝试这个:C# 为什么在连接文件时,字节顺序标记会突然出现?,c#,.net,byte-order-mark,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
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();
}
那么序列就不会出现
我是如何将文件读写为二进制文件并注入一些字节序列的?您的原始文件中有BOM。
File.ReadAllBytes()
像任何其他字节一样,忠实地返回这些字节
File.ReadAllText()
将字节解析为UTF8,剥离BOM表。原始文件中包含BOM表。File.ReadAllBytes()
像任何其他字节一样,忠实地返回这些字节
File.ReadAllText()
将字节解析为UTF8,剥离BOM表。如何验证BOM表不在输入文件中?我敢打赌是的,无论你用什么来检查,都是将其剥离出来……你如何验证BOM不在输入文件中?我敢打赌是的,无论你用什么方法来检查,都会将其剥离出来……交易是标记不会出现在结果的开头和结尾-只出现在结果的内部。@sharptooth:如果中间文件有标记,就会发生这种情况。在hex editor.Ouch中打开原始文件。事实上,第一个文件没有标记,而所有其他文件都有标记。关键是标记不出现在结果的开头和结尾-只出现在结果内部。@sharptooth:如果只有中间的文件有标记,就会出现这种情况。在hex editor.Ouch中打开原始文件。实际上,第一个文件没有标记,而所有其他文件都有标记。