Верно ли, что нельзя дописать что-то не в конец файла, не перезаписав файл? Как поступают, например, стандартные парсилки/редакторы XML (в любом языке программирования) если я вставляю значение поля в середине файла? Перезаписывают весь файл или только то, что после редактируемого места?
И верно и неверно. В общем случае верно. Файл с точки зрения приложения представляет собой непрерывный кусок дисковой памяти. Запись в середину неминуемо приводит к затиранию существующих данных. Обычно программы либо перезаписывают файл целиком, либо начиная с точки изменения и до конца.
Однако, существует путь вставки данных в середину файла без перезаписи. Как известно, данные на диске хранятся в виде блоков и файл представляет собой совокупность блоков, причём где-то может храниться карта блоков для файла, либо же каждый блок содержит ссылку на последующий. Можно создать новый блок, записать в него данные и поменять карту, вставив ссылку на блок. Но у такого подхода есть и недостаток. Либо мы должны вставлять данные блоками определённого размера, либо использовать только часть блока и мириться с потерей части дисковой ёмкости.
Почти любые стандартные и нестандартные средства работают не напрямую с диском или файловой системой тома, а обращаются с запросами на действие к файловому реквестору. Тот соответственно транслирует файловые операции в дисковые (и обратно), инициируя чтение или запись физических секторов.
Если файл полностью считывается в память процесса и потом полностью записывается обратно, то дисковая подсистема тупо выполнит всё запрошенное, и запишет старую информацию поверх новой, несмотря на то, что в ней ни бита не поменялось (это я про "голову файла" до точки внесения изменений) - так дешевле, чем сравнивать то, что было, с тем, что стало.
Но если процесс считывает некоторое "окно", в которое вносятся изменения, и затем это новое состояние сбрасывается на диск, то перезаписыванию подвергнутся только секторы, которые относятся в этому окну. И именно приложение, чтобы не поломать файл, вынуждено будет организовывать чтение следующих "окон", смещение в них информации и запись их нового состояния - и так до конца файла. Процесс, как понимаете, дорогой, а память нынче дёшева - потому подавляющее большинство приложений не занимаются подобным "крохоборством" и для изменения читают, а после изменения пишут, весь файл целиком.
А чтобы при этом не нарваться на проблемы, предпочтительным является не перезапись поверх, а запись нового файла с переименованием и/или удалением старого. Поиск свободного пространства под файл, по возможности непрерывного - тоже недорогая операция, так что новый файл скорее всего окажется физически совсем не в том месте, где лежал файл до корректировки. А заодно такая методика является и пассивным методом борьбы с фрагментацией.
Стандартные парсилки/редакторы XML считывают файл полностью в оперативную память, а потом также полностью записывают его на диск. Для компьютера это гораздо проще и быстрее. Если работать напрямую с жестким диском, то это будет ОЧЕНЬ медленно.
Да, верно.
Зависит от реализации. Вполне допускаю, что файл полностью считывается в память, обрабатывается и полностью сбрасывается на диск.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Например есть файл servicejs есть файл app
Есть инструмент перевода верстки в формат создания через jQuery ? Предположим у нас есть блок