【问题标题】:Remove item from binary file从二进制文件中删除项目
【发布时间】:2012-01-18 22:35:52
【问题描述】:

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

【问题讨论】:

  • 读取前 A 字节,将它们复制到临时文件中,跳过 B 字节,然后继续将其余部分复制到临时文件中。完成后,将其移到原件的顶部。完成。

标签: c# file binary


【解决方案1】:

您可能需要考虑分批工作以防止在 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
        }

【讨论】:

    【解决方案2】:

    取决于...有几种方法可以做到这一点,具体取决于您的要求。

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

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

    简单的方法假设删除和重命名新文件不是问题。如果您对文件附加了特定权限,或者使用了 NTFS 流等,则此方法将不起作用。

    在这种情况下,请复制原始文件。然后,跳到复制文件中要忽略的段之后的第一个字节,跳到源文件中段的开头,并将字节从副本传输到原始文件。如果您使用的是 Streams,则需要调用 Stream.SetLength 将原始文件截断为正确的大小

    【讨论】:

    • 在原始文件中移动数据块有什么问题?
    【解决方案3】:

    如果您只想重写原始文件并从中删除序列,最好的方法是“重新排列”文件。
    这个想法是:

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

    为了获得更好的性能,最好按块而不是单个字节进行读写。使用不同的块大小进行测试,看看哪种最适合您的目标系统。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-11
      • 1970-01-01
      • 2020-06-21
      • 2013-01-29
      • 2023-04-04
      • 2014-06-12
      • 1970-01-01
      • 2014-11-26
      相关资源
      最近更新 更多