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#将字节添加到文件的开头?的主要内容,如果未能解决你的问题,请参考以下文章