4

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

4

4 回答 4

9

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

  1. 打开文件。
  2. 末尾开始,将字节向后移动额外的大小差异。这应该在块中完成(例如ReadBytes),而不是一次一个字节 - 请参阅在流之间复制的最佳方式作为示例。
  3. 在文件开头填写新数据。

然而,这种方法也可能会混淆文件系统预读方案,并且需要寻找/随机文件访问。由于这些问题,我只能诚实地推荐它,如果设备上的空间是绝对溢价的话。

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

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

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

快乐编码。

于 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 回答