3

我正在尝试将文件合并到一个输出文件中,并且我的各个文件上有 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);
           }
         }
      }
4

3 回答 3

7

使用以下方法..

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);
           }
         }
      }
于 2012-05-15T05:48:59.830 回答
4

不要使用流来复制文本。请改用 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”一无所知。

于 2012-05-15T05:43:13.527 回答
0

您不能对任意文件执行此操作。BOM 是几个字节,可能是完全有效的编码。在下面的示例中,代码碰巧编写了一个文件,该文件与以 UTF-16、little-endian 编码的文本“ABC”具有相同的字节,并带有一个 BOM,但这并不意味着前两个字节代表一个 BOM (甚至该文件代表“ABC”)。

public class StackOverflow_10594371
{
    public static void Test()
    {
        using (FileStream fs = File.Create("a.bin"))
        {
            fs.WriteByte(0xFF);
            fs.WriteByte(0xFE);
            fs.WriteByte(0x41);
            fs.WriteByte(0x00);
            fs.WriteByte(0x42);
            fs.WriteByte(0x00);
            fs.WriteByte(0x43);
            fs.WriteByte(0x00);
        }

        Console.WriteLine(File.ReadAllText("a.bin"));
    }
}
于 2012-05-15T05:48:24.593 回答