Действительно ли возможно эффективно вставить или удалить байты с середины большого файла, и раз так как? Или застревают я переписывающий весь файл после точки, где данные были вставлены или удалены?
[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]
Наиболее эффективным способом было бы искать позицию, в которую вы хотите вставить элемент, прочитать все до конца, вставить новый элемент и скопировать обратно все остальное.
Проблема не в языке, а в том, как данные хранятся на носителях, где все представляет собой длинную последовательность битов. Вы можете представить себе это как одну полоску бумаги с данными, написанными ручкой. Если вы хотите что-то вставить, вам придется оттеснить все, что будет после этого. Конечно, если у вас есть много пустого пространства между блоками данных, вы можете вставить туда свой материал (в этом и заключается идея Sparse Files), но это вряд ли экономит место.
Если это неструктурированная папка, вы должны переписать часть после редактирования. Если это файл с логической структурой (например, указатели на другие части файла), то обновления могут быть очень эффективными.
Нет способа вставлять данные или удалять данные в O(1) ни в C#, ни в C++, ни на любом языке со стандартными API или библиотеками классов.
Лучшее, что вы можете сделать, это иметь какой-то формат файла, который вы определяете сами, он может поддерживать вставки и удаление O(1). Но вам, вероятно, придется иметь дело с фрагментацией.
Возможно, вы также могли бы посмотреть на базу данных SQL, такую как sqlite, которая позаботится о сложностях для вас.
Вы должны скопировать файл. В лучшем случае вам удастся избежать использования Sparse Files, но только если "много байт" - это нули.