2015-04-01 6 views
0

Я изучаю это. Не нашли ответа об этом. Возможно ли вставить/удалить данные в файл без их перезаписи? Я знаю, что есть File.AppendAllText(Path, "Content");, но как насчет его удаления?Ввод данных в файл (удаление данных без перезаписи исходного содержимого)

Например.

У нас есть файл "Things.CB". Содержание этого файла:

-1 
-2 
-3 
-4 
-5 
-6 
-7 
-8 
-9 
-10 

Я хочу удалить 7 и 4.

Я открываю файл с моей программой, а затем продолжить читать это число в List<String>.

Когда это произойдет, после выполнения RemoveAt() в список, я получил сериализацию файла, а затем сохранил его с помощью BinaryWriter или streamWriter.

В этом процессе мы сделали 2 вещи, прочитали весь файл, десериализовали, а затем сериализуем его, чтобы мы могли записать его снова.

Я хочу знать, если это возможно только открыть файл, проверьте положение текста, то удаление/вставки и просто сохранить его без serializate или чтений в списке/массивы/и т.д. ...

+0

Готовы ли вы перейти на очень низкий уровень и вмешаться в кластеры на жестком диске? Вы можете изменить FAT (NTFS .. безотносительно), чтобы вы по существу фрагментировали файл, перемещая часть, которую хотите удалить. После этого вы полностью изменили содержимое диска, кроме FAT (или любую другую таблицу таблиц размещения файлов в вашей конкретной ОС) – Grantly

+0

С произвольным доступом к файлам вы могли * переписать * содержимое (например, с пустыми пространствами), но не * delete * (делая 20-байтный файл 16-байтными, после «удаления» 4 и 7).И, IIRC, случайный доступ будет просто загружать весь сектор или в память, делать изменения и записывать их обратно ... (нет, вы не можете частично писать в секторе). – SJuan76

+0

Я не уверен, готов ли я, но я могу начать учиться, возможно ли это сделать с помощью C#? или мне нужно использовать низкоуровневый язык, например, C++? – Mydtys

ответ

0

В зависимости от вашего OS, если вы находитесь в FAT/NTFS, вы можете использовать функции Microsoft API для воспроизведения со структурой FAT/NTFS для определенного файла.

Учтите, что у вас есть три части вашего файла ... 1,2,3. Вы хотите удалить часть 2. Таким образом, вы будете манипулировать FAT, чтобы конец части 1 теперь указывал на начало части 3 - эффективно отбрасывая часть 2 из FAT и заставляя ее казаться удаленной. Затем вы не перемещали никаких данных, просто меняли различные кластеры и маркеры позиции для файла в FAT.

Вы должны использовать ту же технику для вставки данных ... Просто отрегулируйте «указатели», хранящиеся в FAT (индекс файла), чтобы ваши новые данные находились в нужном месте в файле. Без перемещения содержимого вашего файла.

Эти функции API обычно используются при дефрагментации программ (используйте этот термин для поиска в Google) и имеют полный доступ к структурам файлов (хотя я не совсем уверен, что у них достаточно динамики для вас, чтобы обойти нужные вам данные для удаления, не перемещая другое содержимое файла. Они должны хотя). Чтобы перейти на более низкий уровень, потребуется C/C++ и может стать чрезвычайно опасным (резервное копирование всего) и конкретным оборудованием. Вы можете получить доступ к API с помощью C#/VB.NET, хотя это немного утомительно, что-то вроде VB6 будет на удивление быстрее развиваться вокруг функций API, хотя и неуклюже для общего кодирования.

Это не будет работать в сетях, поэтому будет работать только на дисках, физически управляемых вашей ОС. Это также может не работать, если вы хотите удалить очень маленькие биты данных, поскольку гранулярность функций управления FAT может не пойти так мала.

Смежные вопросы