Удалить элемент из двоичного файла - PullRequest
0 голосов
/ 13 декабря 2011

Какой самый лучший и самый быстрый метод в C # для удаления элемента из двоичного файла.У меня есть двоичный файл, и я знаю, что мне нужно удалить байты из позиции A, B количество байтов, как это сделать?Спасибо

Ответы [ 3 ]

0 голосов
/ 13 декабря 2011

Зависит ... Есть несколько способов сделать это, в зависимости от ваших требований.

Основное решение состоит в считывании фрагментов данных из исходного файла в целевой файл, пропуская биты, которыедолжен быть удален (всегда ли удаляется только один сегмент или несколько сегментов?).После того, как вы закончите, удалите исходный файл и переименуйте временный файл на имя оригинала.

Следует помнить, что вы должны стремиться к большим кускам, а не к меньшим.Размер ваших файлов определит подходящее значение.1 МБ - это хорошее значение «по умолчанию».

Простой подход предполагает, что удаление и переименование нового файла не является проблемой.Если у вас есть определенные разрешения, прикрепленные к файлу, или использованные потоки NTFS или что-то подобное, этот подход не будет работать.

В этом случае сделайте копию исходного файла.Затем перейдите к первому байту после сегмента, чтобы игнорировать его в скопированном файле, перейдите к началу сегмента в исходном файле и перенесите байты из копии в оригинал.Если вы используете Streams, вам нужно вызвать Stream.SetLength, чтобы обрезать оригинал до правильного размера

0 голосов
/ 13 декабря 2011

Если вы хотите просто переписать исходный файл и удалить из него последовательность, лучшим способом будет «перегруппировать» файл.
Идея такова:

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

Для повышения производительности этоЛучше всего читать и писать кусками, а не единичными байтами.Протестируйте с различными размерами блоков, чтобы увидеть, что лучше для вашей целевой системы.

0 голосов
/ 13 декабря 2011

Возможно, вы захотите работать в пакетном режиме, чтобы предотвратить выделение на 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
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...