c#如何定位字节文件中的位置并在其后面插入数据

2025-04-14 19:21:45
推荐回答(1个)
回答1:

我之前也有这问题就跟着查 查到了这里,最后我自己写了一个

我的解决思路就是 新建一个tmp文件,从老文件读写数据到新文件到指定位置之后插入需要岔路的数据 接着继续从老文件读写到新文件,最后将老文件删除 新文件改名为老文件


        /// 


/// [静态] 二进制文件中插入Byte[]数据
/// 

/// 欲插入文件地址
/// 插入位置
/// 插入数据
/// 内存池大小
/// 
public static void FileInsertion(string path, long index, List data, int memoryPoolSize = 1024 * 1024 * 3)
{
string tmpFilePath = path + ".tmp";    // 临时文件地址
using(FileStreamfs=newFileStream(path,FileMode.Open))//打开原文件
{
if (File.Exists(tmpFilePath))    // 文件已存在
File.Delete(tmpFilePath);
using (FileStream tmpFs = new FileStream(tmpFilePath, FileMode.Create))     // 打开临时文件
{
int len;
byte[] tmp;
for (long i = 0; i < index; i += memoryPoolSize)    // 向临时文件写入插入前数据
{
len = memoryPoolSize;  // 本次写出长度
if (i + memoryPoolSize >= index) // 长度超出
len = (int)(index - i); // 获取剩余长度
tmp = new byte[len]; // 存储数据临时变量
fs.Seek(i, SeekOrigin.Begin);   // 定位到指定位置
fs.Read(tmp, 0, tmp.Length); // 获取数据
tmpFs.Write(tmp, 0, len);  // 读取指定位置的文件数据
fs.Seek(len, SeekOrigin.Begin);   // 定位到指定位置
}
for (long i = 0; i < data.LongCount(); i += memoryPoolSize)    // 写入欲插入数据
{
len = memoryPoolSize;
if (i + memoryPoolSize >= data.LongCount())
len = (int)(data.LongCount() - i);
tmpFs.Write(data.Take(len).ToArray(), 0, len);
data.RemoveRange(0, len);   // 删除数据
}
for (long i = 0; i < fs.Length - index; i += memoryPoolSize)    // 向临时文件写入插入后数据
{
len = memoryPoolSize;
if (i + memoryPoolSize >= fs.Length - index)
len = (int)(fs.Length - index - i);
tmp = new byte[len];
fs.Seek(index + i, SeekOrigin.Begin);
fs.Read(tmp, 0, tmp.Length);
tmpFs.Write(tmp, 0, len);
fs.Seek(len, SeekOrigin.Begin);
}
}
}
File.Delete(path);  // 删除原文件
File.Move(tmpFilePath, path);   // 修改临时文件名为原文件名
}