从二进制文件中删除项目

时间:2011-12-13 00:03:15

标签: c# file binary

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

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

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

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

简单方法假设删除和重命名新文件不是问题。如果您具有附加到该文件的特定权限,或使用NTFS流或某些特定权限,则此方法将无效。

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

答案 2 :(得分:0)

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

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

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