Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从二进制文件中删除项_C#_File_Binary - Fatal编程技术网

C# 从二进制文件中删除项

C# 从二进制文件中删除项,c#,file,binary,C#,File,Binary,从二进制文件中删除项的最佳和最快的方法是什么? 我有一个二进制文件,我知道我需要从位置a中删除B个字节,怎么做? 感谢您可能想考虑分批工作以防止LOH上的分配,但这取决于文件的大小和调用该逻辑的频率。 long skipIndex = 100; int skipLength = 40; using (FileStream fileStream = File.Open("file.dat", FileMode.Open)) {

从二进制文件中删除项的最佳和最快的方法是什么? 我有一个二进制文件,我知道我需要从位置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.SetLength将原始文件截断为正确的大小

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

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

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

读取第一个A字节,将其复制到临时文件中,跳过B字节,然后继续将其余的复制到临时文件中。完成后,将其移到原稿上方。完成。只在原始文件中移动数据块有什么错?