Я хочу изучить emacs далее, но я просто не могу использовать его для длинных фрагментов времени; это повреждает мои руки. Я делаю что-то ужасно неправильно?
Быстрое и грязное:
<?php
$file_data = "Stuff you want to add\n";
$file_data .= file_get_contents('database.txt');
file_put_contents('database.txt', $file_data);
?>
Если вы не хотите загружать все содержимое файла в переменную, вы можете использовать функцию PHP Streams :
function prepend($string, $orig_filename) {
$context = stream_context_create();
$orig_file = fopen($orig_filename, 'r', 1, $context);
$temp_filename = tempnam(sys_get_temp_dir(), 'php_prepend_');
file_put_contents($temp_filename, $string);
file_put_contents($temp_filename, $orig_file, FILE_APPEND);
fclose($orig_file);
unlink($orig_filename);
rename($temp_filename, $orig_filename);
}
Она записывает строка, которую вы хотите добавить во временный файл, затем записывает содержимое исходного файла в конец временного файла (используя потоки вместо копирования всего файла в переменную) и, наконец, удаляет исходный файл и переименовывает временный файл чтобы заменить его.
Примечание: Этот код был первоначально основан на ныне несуществующем сообщении в блоге Чао Сюй. С тех пор код изменился, но исходное сообщение можно просмотреть в Wayback Machine .
Я думаю, что вы можете сначала прочитать содержимое файла и сохранить его во временной переменной, теперь вставьте новые данные в начало файла перед добавлением содержимого временной переменной.
$file = file_get_contents($filename); $content = 'Your Content' . $file; file_put_contents($content);
Этот код запоминает данные с начала файла, чтобы защитить их от перезаписи. Затем он перезаписывает все данные, существующие в блоке файла, за блоком.
$data = "new stuff to insert at the beggining of the file";
$buffer_size = 10000;
$f = fopen("database.txt", "r+");
$old_data_size = strlen($data);
$old_data = fread($f, $old_data_size);
while($old_data_size > 0) {
fseek($f, SEEK_CUR, -$old_data_size);
fwrite($f, $data);
$data = $old_data;
$old_data = fread($f, $buffer_size);
$old_data_size = strlen($data);
}
fclose($f);
Вы можете использовать fseek
, чтобы изменить указатель в примечании.
Следует отметить, что если вы используете fwrite
, он сотрет текущий контент. Итак, в основном вам нужно прочитать весь файл, использовать fseek
, записать новый контент, записать старые данные файла.
$file_data = file_get_contents('database.txt')
$fp = fopen('database.txt', 'a');
fseek($fp,0);
fwrite($fp, 'new content');
fwrite($fp, $file_data);
fclose($fp);
Если ваш файл действительно огромен и вы не хотите его использовать много памяти, вы можете захотеть использовать двухфайловый подход, например
$fp_source = fopen('database.txt', 'r');
$fp_dest = fopen('database_temp.txt', 'w'); // better to generate a real temp filename
fwrite($fp_dest, 'new content');
while (!feof($fp_source)) {
$contents .= fread($fp_source, 8192);
fwrite($fp_dest, $contents);
}
fclose($fp_source);
fclose($fp_dest);
unlink('database.txt');
rename('database_temp.txt','database.txt');
Решение Бена, по моему честному мнению, кажется более простым.
И последнее: я не знаю, что вы храните в базе данных .txt
, но вы можете сделать то же самое с помощью сервера базы данных.
Нет способ записи в начало файла, как вы думаете. Я предполагаю, что это связано с тем, как ОС и жесткий диск видят файл. У него есть фиксированное начало и расширяющийся конец. Если вы хотите добавить что-то в середине или в начале, потребуется некоторое скольжение. Если это небольшой файл, просто прочтите его, произведите манипуляции и напишите. Но если нет, и если вы всегда добавляете к началу, просто меняйте порядок строк, считайте конец началом ...