C#将字节添加到文件的开头?

Posted

技术标签:

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

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

【问题讨论】:

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

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

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

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

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

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

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

编码愉快。

【讨论】:

【参考方案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:听起来很慢?你试过了吗?总是先尝试容易的事情,然后对它们进行基准测试,看看它们是否真的足够快。

以上是关于C#将字节添加到文件的开头?的主要内容,如果未能解决你的问题,请参考以下文章

C# 创建 MIME 标头信息? (内容类型等)

C# 使用指针将不同值类型赋值到字节数组中

Unity C# 从字节加载图像

使用 fputcsv 将 BOM 添加到 CSV 文件

C# 中的 PayPal IPN 侦听器

将文本和行添加到文件的开头(Python)