文件中插入数据:
先说思路:
小文件: 1.建立byte型数组或者list (新手推荐使用list,C#中能直接使用Insert方法进行数据插入。)
List<byte> dataBuf = new List<byte>();
2.FileStream sw = new FileStream(mfilename, FileMode.Open, FileAccess.ReadWrite);
3.遍历读取并找到符合条件的索引位置
4.在步骤1数组中从后往前对索引地址插入数据
5.sw.Position = 0; //写入位置回到文件开头
6.sw.Write(dataBuf.ToArray(), 0 ,dataBuf.Count) //此时文件数据长度需要按照内存中数组的长度来
代码
try
{
FileStream mFileRead = new FileStream(mfilename, FileMode.OpenOrCreate,FileAccess.ReadWrite,FileShare.ReadWrite);
List<long> seekPosition = new List<long>(); //存放所有0xC0的首位置 索引值以0位首位置
List<byte> fileBuf = new List<byte>(); //存放文件
/*****遍历查找0xC0位置****/
mFileRead.Seek(0, SeekOrigin.Begin); //设置索引首位置
int lastByte = 0;
while (mFileRead.Position < mFileRead.Length) //读到最后一个
{
fileBuf.Add((byte)mFileRead.ReadByte());
if (fileBuf.ElementAt((fileBuf.Count-1)) == '0' && lastByte == 'C') // 找到 0xC0 'C' 的位置
{
seekPosition.Add((long)(mFileRead.Position-2));
}
lastByte = fileBuf.ElementAt((fileBuf.Count - 1));
}
/*******遍历增加回车行*******/
int i = seekPosition.Count - 1; //TODO:要从后往前添加 否则索引错误
byte[] NEXTLINE = new byte[2]{0x0d,0x0a};
while (i>0)
{
if ((seekPosition.ElementAt(i) - seekPosition.ElementAt(i -1)) == 5)
{
lbLOG.Items.Add("0xC0 Nend Add Position =" + seekPosition.ElementAt(i) + "\n");
fileBuf.Insert((int)(seekPosition.ElementAt(i-1) + 3), NEXTLINE[0]);
fileBuf.Insert((int)(seekPosition.ElementAt(i-1) + 4), NEXTLINE[1]);
}
i--;
}
fileBuf.Insert(0, NEXTLINE[0]); //前置回车行
fileBuf.Insert(0, NEXTLINE[1]);
mFileRead.Position = 0;
mFileRead.Write(fileBuf.ToArray(), 0, fileBuf.Count);
mFileRead.Flush(); //写入文件 清除缓冲区
mFileRead.Close(); //关闭文件
}
catch (IOException e)
{
Console.WriteLine("Warnning " +e.ToString() + "\n");
}
实现的功能: 查找 0xC0位置 , 在 0xC0 0xC0中间添加换行
大文件(500m以上):
思路: 1.同目录下新建空白文件
2.同小文件将数据读入内存
3.修改内存中的数据
4.数据保存到新文件中
5.利用File类删除旧文件,FineInfo类修改文件名