Как я могу вставить или удалить байты из середины большого файла в .NET - PullRequest
7 голосов
/ 13 апреля 2010

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

[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]

Ответы [ 4 ]

4 голосов
/ 13 апреля 2010

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

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

2 голосов
/ 13 апреля 2010

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

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

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

1 голос
/ 13 апреля 2010

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

0 голосов
/ 13 апреля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...