【问题标题】:C# prepending bytes to the beginning of a file?C#将字节添加到文件的开头?
【发布时间】:2011-09-03 07:06:43
【问题描述】:

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

【问题讨论】:

  • 文件有多大?事实是,预先准备有点痛苦。如果文件很大,找到一种方法来追加会更有效...
  • 没有那么大.. 最大大约 5mb。

标签: c# file insert byte prepend


【解决方案1】:

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

  1. 打开文件。
  2. 结束开始,将字节向后移动额外的大小差异。这应该在块中完成(例如ReadBytes),而不是一次一个字节 - 请参阅 best way to copy between streams 示例。
  3. 在文件开头填写新数据。

但是,这种方法也可能会混淆文件系统预读方案,并且需要寻找/随机文件访问。由于这些问题,我只能诚实地推荐它,前提是设备上的空间非常宝贵。

另一种原子文件的方法(如果程序在任何阶段终止,则不会丢失数据并且可以恢复进程):

  1. 打开旧文件。
  2. 创建一个新文件。
  3. 在新文件中填写数据。
  4. 将数据从旧文件移动到新文件(再次ReadBytes) - 在这种情况下,之前链接的SO question 应该“按原样工作”。
  5. 删除旧文件并将新文件重命名为旧文件。

“缺点”是它需要一个临时文件。

编码愉快。

【讨论】:

    【解决方案2】:

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

    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
    

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

    【讨论】:

    • 单独写入每个字节?认真的吗?
    • “简洁”!=“唯一的方法”。您还可以预先填充一个数组并使用FileStream.Write 来编写整个标题块。无论如何,SO 的美妙之处在于,即使对于 4 年前已接受答案的问题,您今天也可以选择添加自己的答案,并包含显示性能改进的基准测试结果。如果它不是多余的、过度的或令人费解的,我什至会投赞成票。
    【解决方案3】:

    如果您确实需要预先添加,最“安全”的方法通常是将字节写入新文件,将旧文件写入新文件,最后交换文件(例如使用 File.Replace 和使用 null 作为destinationBackupFileName。)。请注意,您需要足够的空间来复制旧文件!

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • 是的,这听起来像是一种简单的方法,但听起来很慢而且效率低下。我想知道是否有更好的方法。
      • @david:听起来很慢?你试过了吗?总是先尝试容易的事情,然后对它们进行基准测试,看看它们是否真的足够快。
      猜你喜欢
      • 1970-01-01
      • 2021-11-14
      • 2011-03-31
      • 1970-01-01
      • 2019-09-19
      • 2014-12-17
      • 2011-03-20
      相关资源
      最近更新 更多