PHP - Недостатки fwrite?

Я работаю над классом обработчика файлов и сталкиваюсь с некоторыми проблемами с потоками файла. При обеспечении функциональности для операций тех, которые добавляют и перезапись является простым вопросом изменения режима, переданного fopen.

Однако обеспечивая простой способ вставить, обновите и удалите, оказывается более сложным. В значительной степени все проблемы, которые я имею, с fwrite.

Вставьте - Насколько я могу сказать, нет способа вставить символы в местоположении кроме конца файла с помощью fwrite. Эти две опции, которые я придумал, используют file_get_contents и в большой степени используют fseek/fwrite для расширения файла.

Удалите - К сожалению, пытаясь записать, что ПУСТОЙ УКАЗАТЕЛЬ с помощью fwrite не является тем же самым как 'удалением' символа. Как со вставкой данных, опции снова являются file_get_contents и fseek/fwrite.

Обновление - Обновление данных в файле является комбинацией вставить/удалить проблем. Если бы новое значение короче, чем старое значение, то я должен был бы удалить дополнительные символы. Если бы новое значение длиннее, чем старое значение, я должен был бы вставить дополнительные символы. Если они будут той же длиной, то просто использование fwrite будет прекрасно.

Хотелось бы надеяться, существует что-то, о чем я не знаю, который может разрешить эту проблему чисто. Каждая из опций, я нашел использование любым file_get_contents (начиная с которого я не забочусь, весь файл должен быть считан в память) или в большой степени использует fseek/fwrite для изменения длины файла (который кажется замысловатым мне).

У кого-либо есть идея, о которой я не думал?

Спасибо!

1
задан Ogo 29 June 2010 в 13:48
поделиться

2 ответа

Вот и все. Практически все языки делают это одинаково. Рекомендуемый способ - использовать временный файл и передавать исходный файл по частям, а затем атомарно перемещать временный файл поверх оригинала.

Однако есть программы, которые делают такие вещи за вас, причем гораздо более оптимизированным образом - в первую очередь, движки баз данных.

1
ответ дан 2 September 2019 в 23:25
поделиться

Вы всегда можете использовать fseek () и fwrite () для перетасовки файла «кусками» фиксированного размера вместо использования file_get_contents (). Логика довольно проста, но я подозреваю, что она будет громоздкой и медленной, если будет реализована непосредственно в PHP, а не в виде библиотеки C.

1
ответ дан 2 September 2019 в 23:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: