2008-09-19 4 views

ответ

21

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

Чтобы вставить текст без перезаписывания начала файла, вы должны будете открыть его для добавления (a+ rather than r+)

$file=fopen(date("Y-m-d").".txt","a+") or exit("Unable to open file!"); 

if ($_POST["lastname"] <> "") 
{ 
    fwrite($file,$_POST["lastname"]."\n"); 
} 

fclose($file); 

Если вы пытаетесь написать к началу файл, сначала вам нужно будет прочитать содержимое файла (см. file_get_contents), а затем записать новую строку, а затем содержимое файла в выходной файл.

$old_content = file_get_contents($file); 
fwrite($file, $new_content."\n".$old_content); 

выше подход будет работать с небольшими файлами, но вы можете работать в пределах памяти, пытаясь прочитать большой файл при помощи file_get_conents. В этом случае рассмотрим использование rewind($file), которое устанавливает указатель позиции файла для дескриптора в начало потока файлов. Примечание при использовании rewind(), чтобы не открыть файл с a (или a+) варианты, как:

Если вы открыли режим файл в Append («а» или «+»), любые данные, запись в файл всегда будет добавлена, независимо от положения файла.

+1

Вы бьете меня к этому, я писал это. – UnkwnTech 2008-09-19 16:58:44

0

Если вы хотите поместить текст в начале файла, вы должны сначала прочитать содержимое файла, как:

<?php 

$file=fopen(date("Y-m-d").".txt","r+") or exit("Unable to open file!"); 

if ($_POST["lastname"] <> "") 
{  
    $existingText = file_get_contents($file); 
    fwrite($file, $existingText . $_POST["lastname"]."\n"); 
} 

fclose($file); 

?> 
0

Вы получаете то же самое открытие файла для добавления

<?php 
$file=fopen(date("Y-m-d").".txt","a+") or exit("Unable to open file!"); 
if ($_POST["lastname"] <> "") 
{ 
    fwrite($file,$_POST["lastname"]."\n"); 
} 
fclose($file); 
?> 
1

рабочий пример для вставки в середине потока файлов без перезаписи, и без того, чтобы загрузить все это в переменную/память:

function finsert($handle, $string, $bufferSize = 16384) { 
    $insertionPoint = ftell($handle); 

    // Create a temp file to stream into 
    $tempPath = tempnam(sys_get_temp_dir(), "file-chainer"); 
    $lastPartHandle = fopen($tempPath, "w+"); 

    // Read in everything from the insertion point and forward 
    while (!feof($handle)) { 
     fwrite($lastPartHandle, fread($handle, $bufferSize), $bufferSize); 
    } 

    // Rewind to the insertion point 
    fseek($handle, $insertionPoint); 

    // Rewind the temporary stream 
    rewind($lastPartHandle); 

    // Write back everything starting with the string to insert 
    fwrite($handle, $string); 
    while (!feof($lastPartHandle)) { 
     fwrite($handle, fread($lastPartHandle, $bufferSize), $bufferSize); 
    } 

    // Close the last part handle and delete it 
    fclose($lastPartHandle); 
    unlink($tempPath); 

    // Re-set pointer 
    fseek($handle, $insertionPoint + strlen($string)); 
} 

$handle = fopen("file.txt", "w+"); 
fwrite($handle, "foobar"); 
rewind($handle); 
finsert($handle, "baz"); 

// File stream is now: bazfoobar 

Composer lib for it can be found here