باستخدام PHP، كيفية إدراج نص دون الكتابة فوق بداية ملف نصي

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

  •  01-07-2019
  •  | 
  •  

سؤال

أملك:

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

?>

لكنه يكتب فوق بداية الملف.كيف أجعله يدخل؟

هل كانت مفيدة؟

المحلول

لست متأكدًا تمامًا من سؤالك - هل تريد كتابة البيانات وعدم السماح لها بالكتابة فوق بداية ملف موجود، أو كتابة بيانات جديدة في بداية ملف موجود، مع الاحتفاظ بالمحتوى الموجود بعده؟

لإدراج نص دون الكتابة فوق بداية الملف, ، سيتعين عليك فتحه للإلحاق (a+ بدلا من 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+) الخيارات، مثل:

إذا قمت بفتح الملف في وضع الإلحاق ("a" أو "a+")، فسيتم دائمًا إلحاق أي بيانات تكتبها في الملف، بغض النظر عن موضع الملف.

نصائح أخرى

مثال عملي للإدراج في منتصف دفق ملف دون الكتابة فوقه، ودون الحاجة إلى تحميل كل شيء في متغير/ذاكرة:

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 هنا

تحصل على نفس فتح الملف للإلحاق

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

إذا كنت تريد وضع النص الخاص بك في بداية الملف، فعليك قراءة محتويات الملف أولاً مثل:

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

?>
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top