C# 使用流复制时跳过字节顺序标记(BOM)
我正在尝试将文件合并到输出文件中,而我的各个文件上都有BOM表,如何在使用Stream.CopyTo方法时将其删除 我的代码如下所示:C# 使用流复制时跳过字节顺序标记(BOM),c#,file,byte-order-mark,C#,File,Byte Order Mark,我正在尝试将文件合并到输出文件中,而我的各个文件上都有BOM表,如何在使用Stream.CopyTo方法时将其删除 我的代码如下所示: using (var output = File.Open(outputFile,FileMode.Append,FileAccess.Write)) { foreach (var inputFile in inputFiles) { using (var input = File.OpenR
using (var output = File.Open(outputFile,FileMode.Append,FileAccess.Write))
{
foreach (var inputFile in inputFiles)
{
using (var input = File.OpenRead(inputFile))
{
input.CopyTo(output);
}
}
}
不要使用流复制文本。改用StreamReader/StreamWriter:
using (var output = File.AppendText(outputFile))
{
foreach (var inputFile in inputFiles)
{
using (var input = File.OpenText(inputFile))
{
while (!input.EndOfStream)
{
output.WriteLine(input.ReadLine());
}
}
}
}
任何流实例都在字节级别工作,它对“字符编码”和“BOM”一无所知。您不能对任意文件执行此操作。BOM是几个字节,可能是完全有效的编码。在下面的示例中,代码碰巧编写了一个与UTF-16中编码的文本“ABC”具有相同字节的文件,该文本是带BOM的little endian,但这并不意味着前两个字节表示BOM(甚至该文件表示“ABC”)
使用以下方法
using (var output = File.Open(outputFile,FileMode.Append,FileAccess.Write))
{
foreach (var inputFile in inputFiles)
{
using (var input = File.OpenRead(inputFile))
{
input.Position = Encoding.Unicode.GetPreamble().Length; //The encoding might be any type.
input.CopyTo(output);
}
}
}
using (var output = File.Open(outputFile,FileMode.Append,FileAccess.Write))
{
foreach (var inputFile in inputFiles)
{
using (var input = File.OpenRead(inputFile))
{
input.Position = Encoding.Unicode.GetPreamble().Length; //The encoding might be any type.
input.CopyTo(output);
}
}
}