Должен записать в начале файла с PHP

Я хочу изучить emacs далее, но я просто не могу использовать его для длинных фрагментов времени; это повреждает мои руки. Я делаю что-то ужасно неправильно?

35
задан Brian Tompsett - 汤莱恩 7 November 2015 в 10:15
поделиться

6 ответов

Быстрое и грязное:

<?php
$file_data = "Stuff you want to add\n";
$file_data .= file_get_contents('database.txt');
file_put_contents('database.txt', $file_data);
?>
53
ответ дан 27 November 2019 в 06:32
поделиться

Если вы не хотите загружать все содержимое файла в переменную, вы можете использовать функцию 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 .

39
ответ дан 27 November 2019 в 06:32
поделиться

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

$file = file_get_contents($filename);
$content = 'Your Content' . $file;
file_put_contents($content);  
4
ответ дан 27 November 2019 в 06:32
поделиться

Этот код запоминает данные с начала файла, чтобы защитить их от перезаписи. Затем он перезаписывает все данные, существующие в блоке файла, за блоком.

$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);
1
ответ дан 27 November 2019 в 06:32
поделиться

Вы можете использовать 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 , но вы можете сделать то же самое с помощью сервера базы данных.

1
ответ дан 27 November 2019 в 06:32
поделиться

Нет способ записи в начало файла, как вы думаете. Я предполагаю, что это связано с тем, как ОС и жесткий диск видят файл. У него есть фиксированное начало и расширяющийся конец. Если вы хотите добавить что-то в середине или в начале, потребуется некоторое скольжение. Если это небольшой файл, просто прочтите его, произведите манипуляции и напишите. Но если нет, и если вы всегда добавляете к началу, просто меняйте порядок строк, считайте конец началом ...

1
ответ дан 27 November 2019 в 06:32
поделиться
Другие вопросы по тегам:

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