从二进制文件中删除项目

本文关键字:删除项目 二进制文件 | 更新日期: 2023-09-27 18:17:43

从二进制文件中删除项目的最好和最快的方法是什么?我有一个二进制文件,我知道我需要从位置a中删除B个字节,怎么做?由于

从二进制文件中删除项目

您可能想要考虑批量工作以防止LOH上的分配,但这取决于文件的大小和调用此逻辑的频率。

        long skipIndex = 100;
        int skipLength = 40;
        using (FileStream fileStream = File.Open("file.dat", FileMode.Open))
        {
            int bufferSize;
            checked 
            { 
                bufferSize = (int)(fileStream.Length - (skipLength + skipIndex)); 
            }
            byte[] buffer = new byte[bufferSize];
            // read all data after
            fileStream.Position = skipIndex + skipLength;
            fileStream.Read(buffer, 0, bufferSize);
            // write to displacement
            fileStream.Position = skipIndex;
            fileStream.Write(buffer, 0, bufferSize);
            fileStream.SetLength(fileStream.Position); // trim the file
        }

看情况…有几种方法可以做到这一点,这取决于您的需求。

基本的解决方案是从源文件读取数据块到目标文件,跳过必须删除的位(总是只有一个段要删除,还是多个段?)完成后,删除原始文件并将临时文件重命名为原始文件。

这里要记住的是,你应该倾向于更大的块而不是更小的块。文件的大小将决定一个合适的值。1MB是一个很好的默认值。

这个简单的方法假定删除和重命名一个新文件不是问题。如果您对文件附加了特定的权限,或者使用了NTFS流或诸如此类的东西,那么这种方法将不起作用。

在这种情况下,复制原始文件。然后,跳到复制文件中要忽略的段后的第一个字节,跳到源文件中段的开始,从副本到原始传输字节。如果你正在使用Streams,你会想要调用Stream。

如果你只想重写原始文件,并从中删除一个序列,最好的方法是"重新排列"文件。
思路是:

for i = A+1 to file.length - B
    file[i] = file[i+B]

为了获得更好的性能,最好以块为单位读写,而不是单个字节。测试不同的块大小,看看最适合您的目标系统。