在文件开头添加字节的最快和最有效的方法是什么?基本上,我想打开一个文件,然后向它添加一些字节。我想过使用循环,但考虑到要添加的所有字节都是相同的,我认为没有必要。
问问题
2896 次
4 回答
9
一种对文件不是原子的方法(也就是说,如果程序在中间死掉,数据可能会处于不一致的状态):
- 打开文件。
- 从末尾开始,将字节向后移动额外的大小差异。这应该在块中完成(例如
ReadBytes
),而不是一次一个字节 - 请参阅在流之间复制的最佳方式作为示例。 - 在文件开头填写新数据。
然而,这种方法也可能会混淆文件系统预读方案,并且需要寻找/随机文件访问。由于这些问题,我只能诚实地推荐它,如果设备上的空间是绝对溢价的话。
另一种对文件是原子的方法(如果程序在任何阶段死亡,则不会丢失数据并且可以恢复进程):
- 打开旧文件。
- 创建一个新文件。
- 在新文件中填写数据。
- 将数据从旧文件移动到新文件(再次
ReadBytes
) - 在这种情况下,先前链接的SO 问题应该“按原样工作”。 - 删除旧文件并将新文件重命名为旧文件。
“缺点”是它需要一个临时文件。
快乐编码。
于 2011-09-03T07:26:33.503 回答
4
如果您确实需要预先添加,最“安全”的方法通常是将字节写入新文件,将旧文件写入新文件,最后交换文件(例如File.Replace
,使用 null 作为destinationBackupFileName。) . 请注意,您需要足够的空间来复制旧文件!
于 2011-09-03T07:23:42.720 回答
4
这是我个人能想到的最简洁的方式,但不会像你想要的那样避免循环:
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
它也可以使用一些错误处理,但你明白了。
于 2011-09-03T07:35:21.613 回答
0
我能想到的最简单的方法是创建一个字节数组,添加您的“前置”字节,然后将您要使用的文件转换为另一个字节数组并将它们合并在一起!
于 2011-09-03T07:10:19.037 回答