C#将字节前置到文件的开头?

时间:2011-09-03 07:06:43

标签: c# file insert byte prepend

在文件开头添加字节的最快最有效的方法是什么?基本上,我想打开一个文件然后添加一些字节。我想过使用一个循环,但考虑到前置的所有字节是相同的,我认为没有必要。

4 个答案:

答案 0 :(得分:9)

一种非原子文件的方法(也就是说,如果程序在中间死亡,数据可能会处于不一致状态):

  1. 打开文件。
  2. 结束开始,将字节向后移动额外的大小差异。这应该以块(例如ReadBytes)完成,而不是一次一个字节 - 请参阅best way to copy between streams以获取示例。
  3. 在文件开头填写新数据。
  4. 然而,这种方法也可能使文件系统预读方案混淆,并且需要搜索/随机文件访问。由于存在这些问题,如果设备上的空间绝对溢价,我只能诚实地推荐它。

    另一种 atomic 文件的方法(如果程序在任何阶段死亡,没有数据丢失并且可以恢复该过程):

    1. 打开旧文件。
    2. 创建新文件。
    3. 在新文件中填写数据。
    4. 将数据从旧文件移至新文件(再次ReadBytes) - 在这种情况下,之前链接的SO question应“按原样运行”。
    5. 删除旧文件并将新文件重命名为旧文件。
    6. “缺点”是它需要一个临时文件。

      快乐的编码。

答案 1 :(得分:4)

如果你真的需要前置,最“安全”的方式通常是将新文件写入你的字节,将这个新文件写入旧文件并最终交换文件(例如使用{{1}并使用null作为destinationBackupFileName。)。请注意,您需要足够的空间来复制旧文件!

答案 2 :(得分:3)

这是我个人能想到的最简洁的方式,但不会像你想要的那样避免循环:

int numberOfBytes = 100;
byte newByte = 0x1;

using ( var newFile = new FileStream( @"C:\newfile.dat", FileMode.CreateNew, FileAccess.Write ) )
{
    for ( var i = 0; i < numberOfBytes; i++ )
    {
        newFile.WriteByte( newByte );
    }
    using ( var oldFile = new FileStream( @"C:\oldfile.dat", FileMode.Open, FileAccess.Read ) )
    {
        oldFile.CopyTo(newFile);
    }
}

// Rename and delete files, or whatever you want to do

它也可以使用一些错误处理,但你明白了。

答案 3 :(得分:0)

我能想到的最简单的方法是创建一个字节数组,添加你的“prepend”字节,然后将你想要使用的文件转换成另一个字节数组并将它们合并在一起!