如何使用C#将字符插入文件

时间:2020-03-06 14:24:13  来源:igfitidea点击:

我有一个很大的文件,必须在特定位置插入某些字符。在没有再次重写整个文件的情况下,最简单的方法是C。

解决方案

从插入更改到结束,我们可能需要重写文件。我们最好总是写到文件末尾,并使用诸如sort和grep之类的工具以所需的顺序取出数据。我假设我们在这里谈论的是文本文件,而不是二进制文件。

我们可以使用随机访问来写入文件的特定位置,但是我们将无法以文本格式进行操作,必须直接使用字节。

根据项目的范围,我们可能需要决定将文本的每一行与文件插入表数据结构中。有点像数据库表,这样我们就可以在任何给定时刻插入到特定位置,而不必每次都读入,修改和输出整个文本文件。考虑到事实是数据"很大"。我们仍然会重新创建文件,但是至少我们以这种方式创建了可伸缩的解决方案。

文件系统不支持在文件中间"插入"数据。如果我们确实需要可以以某种方式写入的文件,建议我们使用嵌入式数据库。

我们可能想看看SQLite或者BerkeleyDB。

再说一次,我们可能正在使用文本文件或者旧式二进制文件。在这种情况下,我们唯一的选择是至少从插入点到末尾重写文件。

我将查看FileStream类以在C#中进行随机I / O。

它可能是"可能的",具体取决于文件系统如何存储文件以在中间快速插入(即添加其他)字节。如果远程可行,则一次只能对一个完整块进行操作,并且只能通过对文件系统本身进行低级修改或者使用文件系统特定接口来进行。

文件系统通常不是为此操作设计的。如果我们需要快速执行插入操作,则确实需要一个更通用的数据库。

根据应用程序,中间的一个目的是将插入的内容捆在一起,因此我们只重写一次文件,而不是二十次。

如果不重写字符,就无法将字符插入文件中。使用Cit可以用任何Stream类完成。如果文件很大,我建议我们在Ccode中使用GNU Core Utils。他们是最快的。我以前使用核心工具(大小为4GB,8GB或者更多)来处理非常大的文本文件。诸如head,tail,split,csplit,cat,shuf,shred,uniq之类的命令确实对文本操作有很大帮助。

例如,如果我们需要在2GB的文件中放入一些字符,则可以使用split -b BYTECOUNT,将ouptut放入文件中,将新文本添加到文件中,然后获取其余内容并添加到文件中。据认为,这应该比其他任何方式都快。

希望它能工作。试试看。

如果我们知道要将新数据写入的特定位置,请使用BinaryWriter类:

using (BinaryWriter bw = new BinaryWriter (File.Open (strFile, FileMode.Open)))
{
    string strNewData = "this is some new data";
    byte[] byteNewData = new byte[strNewData.Length];

    // copy contents of string to byte array
    for (var i = 0; i < strNewData.Length; i++)
    {
        byteNewData[i] = Convert.ToByte (strNewData[i]);
    }

    // write new data to file
    bw.Seek (15, SeekOrigin.Begin);  // seek to position 15
    bw.Write (byteNewData, 0, byteNewData.Length);
}