C# 使用流复制时跳过字节顺序标记(BOM)

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

我正在尝试将文件合并到输出文件中,而我的各个文件上都有BOM表,如何在使用Stream.CopyTo方法时将其删除

我的代码如下所示:

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);
           }
         }
      }