#javascript #java #cpp #python #xml
Верно ли, что нельзя дописать что-то не в конец файла, не перезаписав файл? Как поступают, например, стандартные парсилки/редакторы XML (в любом языке программирования) если я вставляю значение поля в середине файла? Перезаписывают весь файл или только то, что после редактируемого места?
Ответы
Ответ 1
И верно и неверно. В общем случае верно. Файл с точки зрения приложения представляет собой непрерывный кусок дисковой памяти. Запись в середину неминуемо приводит к затиранию существующих данных. Обычно программы либо перезаписывают файл целиком, либо начиная с точки изменения и до конца. Однако, существует путь вставки данных в середину файла без перезаписи. Как известно, данные на диске хранятся в виде блоков и файл представляет собой совокупность блоков, причём где-то может храниться карта блоков для файла, либо же каждый блок содержит ссылку на последующий. Можно создать новый блок, записать в него данные и поменять карту, вставив ссылку на блок. Но у такого подхода есть и недостаток. Либо мы должны вставлять данные блоками определённого размера, либо использовать только часть блока и мириться с потерей части дисковой ёмкости.Ответ 2
Почти любые стандартные и нестандартные средства работают не напрямую с диском или файловой системой тома, а обращаются с запросами на действие к файловому реквестору. Тот соответственно транслирует файловые операции в дисковые (и обратно), инициируя чтение или запись физических секторов. Если файл полностью считывается в память процесса и потом полностью записывается обратно, то дисковая подсистема тупо выполнит всё запрошенное, и запишет старую информацию поверх новой, несмотря на то, что в ней ни бита не поменялось (это я про "голову файла" до точки внесения изменений) - так дешевле, чем сравнивать то, что было, с тем, что стало. Но если процесс считывает некоторое "окно", в которое вносятся изменения, и затем это новое состояние сбрасывается на диск, то перезаписыванию подвергнутся только секторы, которые относятся в этому окну. И именно приложение, чтобы не поломать файл, вынуждено будет организовывать чтение следующих "окон", смещение в них информации и запись их нового состояния - и так до конца файла. Процесс, как понимаете, дорогой, а память нынче дёшева - потому подавляющее большинство приложений не занимаются подобным "крохоборством" и для изменения читают, а после изменения пишут, весь файл целиком. А чтобы при этом не нарваться на проблемы, предпочтительным является не перезапись поверх, а запись нового файла с переименованием и/или удалением старого. Поиск свободного пространства под файл, по возможности непрерывного - тоже недорогая операция, так что новый файл скорее всего окажется физически совсем не в том месте, где лежал файл до корректировки. А заодно такая методика является и пассивным методом борьбы с фрагментацией.Ответ 3
Стандартные парсилки/редакторы XML считывают файл полностью в оперативную память, а потом также полностью записывают его на диск. Для компьютера это гораздо проще и быстрее. Если работать напрямую с жестким диском, то это будет ОЧЕНЬ медленно.Ответ 4
Да, верно. Зависит от реализации. Вполне допускаю, что файл полностью считывается в память, обрабатывается и полностью сбрасывается на диск.