В PHP, если Вы пишете в файл, что он запишет конец того существующего файла.
Как мы предварительно ожидаем файл для записи в начале того файла?
Я попробовал rewind($handle)
функционируйте, но кажется перезаписью, если текущее содержание больше, чем существующий.
Какие-либо идеи?
Решение file_get_contents неэффективно для больших файлов. Это решение может занять больше времени, в зависимости от количества данных, которые необходимо добавить в начало (чем больше, тем лучше), но оно не займет память.
<?php
$cache_new = "Prepend this"; // this gets prepended
$file = "file.dat"; // the file to which $cache_new gets prepended
$handle = fopen($file, "r+");
$len = strlen($cache_new);
$final_len = filesize($file) + $len;
$cache_old = fread($handle, $len);
rewind($handle);
$i = 1;
while (ftell($handle) < $final_len) {
fwrite($handle, $cache_new);
$cache_new = $cache_old;
$cache_old = fread($handle, $len);
fseek($handle, $i * $len);
$i++;
}
?>
$prepend = 'prepend me please';
$file = '/path/to/file';
$fileContents = file_get_contents($file);
file_put_contents($file, $prepend . $fileContents);
При использовании fopen () вы можете установить режим установки указателя (т.е. начало или конец.
$afile = fopen("file.txt", "r+");
'r' Открыть только для чтения; поместить указатель файла в начале файл.
'r +' Открыто для чтения и письмо; поместите указатель файла на начало файла.
Другое (грубое) предложение:
$tempFile = tempnam('/tmp/dir');
$fhandle = fopen($tempFile, 'w');
fwrite($fhandle, 'string to prepend');
$oldFhandle = fopen('/path/to/file', 'r');
while (($buffer = fread($oldFhandle, 10000)) !== false) {
fwrite($fhandle, $buffer);
}
fclose($fhandle);
fclose($oldFhandle);
rename($tempFile, '/path/to/file');
Это имеет недостаток использования временного файла, но в остальном довольно эффективно.