Utilizando PHP, como inserir texto sem substituir para o início de um arquivo de texto

StackOverflow https://stackoverflow.com/questions/103593

  •  01-07-2019
  •  | 
  •  

Pergunta

Eu tenho:

<?php

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

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

fclose($file);

?>

mas substitui o início do arquivo. Como faço para torná-lo inserir?

Foi útil?

Solução

Eu não sou inteiramente certo da sua pergunta - você quer gravar dados e não tê-lo sobre-escrever o início de um arquivo existente, ou gravar novos dados para o início de um arquivo existente, mantendo o conteúdo existente após -lo?

Para inserir texto sem sobre-escrever o início do arquivo , você vai ter que abri-lo para anexar ( a+ em vez de 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);

Se você está tentando escrever para o início do arquivo , você vai ter que ler no conteúdo dos arquivos (veja file_get_contents ) em primeiro lugar, em seguida, escrever a sua nova cadeia seguido por conteúdo do arquivo para o arquivo de saída.

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

A abordagem acima irá trabalhar com arquivos pequenos, mas você pode executar em limites de memória tentando ler um arquivo grande em usar file_get_conents. Neste caso, considere o uso rewind($file) , que define o indicador de posição de arquivo identificador para o início do fluxo de arquivo . Nota quando utilizar rewind(), para não abrir o arquivo com as opções a (ou a+), como:

Se você abriu o arquivo em modo de adição ( "a" ou "a +") modo, todos os dados que você escreve para o arquivo sempre será anexado, independentemente da posição do arquivo.

Outras dicas

Um exemplo de trabalho para a inserção no meio de um fluxo de arquivo sem substituir, e sem ter que carregar a coisa toda em uma variável / memória:

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

lib Composer para ele pode ser encontrada aqui

Você recebe a mesma abertura do arquivo para acrescentar

<?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);
?>

Se você quiser colocar o seu texto no início do arquivo, você tem que ler o conteúdo do arquivo primeiro como:

<?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);

?>
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top