Я работаю над классом обработчика файлов и сталкиваюсь с некоторыми проблемами с потоками файла. При обеспечении функциональности для операций тех, которые добавляют и перезапись является простым вопросом изменения режима, переданного fopen.
Однако обеспечивая простой способ вставить, обновите и удалите, оказывается более сложным. В значительной степени все проблемы, которые я имею, с fwrite.
Вставьте - Насколько я могу сказать, нет способа вставить символы в местоположении кроме конца файла с помощью fwrite. Эти две опции, которые я придумал, используют file_get_contents и в большой степени используют fseek/fwrite для расширения файла.
Удалите - К сожалению, пытаясь записать, что ПУСТОЙ УКАЗАТЕЛЬ с помощью fwrite не является тем же самым как 'удалением' символа. Как со вставкой данных, опции снова являются file_get_contents и fseek/fwrite.
Обновление - Обновление данных в файле является комбинацией вставить/удалить проблем. Если бы новое значение короче, чем старое значение, то я должен был бы удалить дополнительные символы. Если бы новое значение длиннее, чем старое значение, я должен был бы вставить дополнительные символы. Если они будут той же длиной, то просто использование fwrite будет прекрасно.
Хотелось бы надеяться, существует что-то, о чем я не знаю, который может разрешить эту проблему чисто. Каждая из опций, я нашел использование любым file_get_contents (начиная с которого я не забочусь, весь файл должен быть считан в память) или в большой степени использует fseek/fwrite для изменения длины файла (который кажется замысловатым мне).
У кого-либо есть идея, о которой я не думал?
Спасибо!
Вот и все. Практически все языки делают это одинаково. Рекомендуемый способ - использовать временный файл и передавать исходный файл по частям, а затем атомарно перемещать временный файл поверх оригинала.
Однако есть программы, которые делают такие вещи за вас, причем гораздо более оптимизированным образом - в первую очередь, движки баз данных.
Вы всегда можете использовать fseek () и fwrite () для перетасовки файла «кусками» фиксированного размера вместо использования file_get_contents (). Логика довольно проста, но я подозреваю, что она будет громоздкой и медленной, если будет реализована непосредственно в PHP, а не в виде библиотеки C.