Как я могу вставить или удалить байты с середины большого файла в.NET

Действительно ли возможно эффективно вставить или удалить байты с середины большого файла, и раз так как? Или застревают я переписывающий весь файл после точки, где данные были вставлены или удалены?

[A lot of Bytes][Unwanted Bytes][A lot of Bytes] - > [A lot of Bytes][A lot of Bytes]

or

[A lot of Bytes][A lot of Bytes] - > [A lot of Bytes][New Inserted Bytes][A lot of Bytes]
7
задан SqlRyan 13 April 2010 в 03:14
поделиться

4 ответа

Наиболее эффективным способом было бы искать позицию, в которую вы хотите вставить элемент, прочитать все до конца, вставить новый элемент и скопировать обратно все остальное.

Проблема не в языке, а в том, как данные хранятся на носителях, где все представляет собой длинную последовательность битов. Вы можете представить себе это как одну полоску бумаги с данными, написанными ручкой. Если вы хотите что-то вставить, вам придется оттеснить все, что будет после этого. Конечно, если у вас есть много пустого пространства между блоками данных, вы можете вставить туда свой материал (в этом и заключается идея Sparse Files), но это вряд ли экономит место.

4
ответ дан 7 December 2019 в 07:42
поделиться

Если это неструктурированная папка, вы должны переписать часть после редактирования. Если это файл с логической структурой (например, указатели на другие части файла), то обновления могут быть очень эффективными.

1
ответ дан 7 December 2019 в 07:42
поделиться

Нет способа вставлять данные или удалять данные в O(1) ни в C#, ни в C++, ни на любом языке со стандартными API или библиотеками классов.

Лучшее, что вы можете сделать, это иметь какой-то формат файла, который вы определяете сами, он может поддерживать вставки и удаление O(1). Но вам, вероятно, придется иметь дело с фрагментацией.

Возможно, вы также могли бы посмотреть на базу данных SQL, такую как sqlite, которая позаботится о сложностях для вас.

2
ответ дан 7 December 2019 в 07:42
поделиться

Вы должны скопировать файл. В лучшем случае вам удастся избежать использования Sparse Files, но только если "много байт" - это нули.

0
ответ дан 7 December 2019 в 07:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: