我之前也有这问题就跟着查 查到了这里,最后我自己写了一个
我的解决思路就是 新建一个tmp文件,从老文件读写数据到新文件到指定位置之后插入需要岔路的数据 接着继续从老文件读写到新文件,最后将老文件删除 新文件改名为老文件
///
/// [静态] 二进制文件中插入Byte[]数据
///
/// 欲插入文件地址
/// 插入位置
/// 插入数据
/// 内存池大小
///
public static void FileInsertion(string path, long index, List
{
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); // 修改临时文件名为原文件名
}