Допустим, у меня есть текстовый файл с умеренным размером (~ 850kb, 10 000+ строк)
И я хочу заменить определенную строку (или несколько), распространенную среди файла.
Текущие методы для этого включают повторную запись всего файла. Текущий метод, который я использую, считывается через весь файл по строкам, записывается в файл .tmp, и как только я закончил, я переименую () файл tmp в исходный исходный файл.
Он работает, но он медленный. И, разумеется, по мере роста файла, так же будет время выполнения.
Есть ли другой способ (используя PHP), чтобы выполнить эту работу, не переписывая весь файл каждый раз, когда нужно заменить или удалить строку или две?
Благодаря! Я огляделся и не смог найти ответ на этот вопрос в stackoverflow.
Если замена ТОЧНО того же размера, что и исходная строка, вы можете просто fwrite()
в этом месте в файле, и все в порядке. Но если это другая длина (короче ИЛИ дольше), вам придется переписать часть файла, который появляется после замены.
Об этом нет. Более короткие «новые» линии оставляют пробел в файле, и более длинные «новые» строки будут перезаписывать первую часть следующей строки.
В принципе, вы спрашиваете, можно ли вставить кусок дерева в середине другой доски, не перемещая оригинальную доску.
Вы не можете, из-за того, что файлы хранятся в обычных файловых системах. Файл всегда занимает один или несколько «блоков» на диске, где размер блоков составляет, например, 4096 байт. Файл, который имеет один байт данных, по-прежнему будет занимать один цельный блок (потребляя 4096 байт свободного места на диске), а файл размером 4097 байт займет два блока (занимает 8192 байта).
Если вы удаляете один байт из файла, в одном из блоков он будет иметь пробел в один байт, который невозможно сохранить на диске. Вы должны перенести все остальные байты на один байт в начало файла, что повлияет на текущий и все последующие блоки.
С другой стороны, добавление байтов в середине блока показывает ту же проблему: у вас будет один или несколько байтов, которые больше не вписываются в 4096 байт, поэтому им придется перейти в следующий блок, и так далее, до тех пор, пока не будет достигнут конец файла (и всех блоков).
Единственное место, где вы можете иметь незанятые байты в блоке, находится в конце последнего блока, который формирует файл.