باستخدام PHP، كيفية إدراج نص دون الكتابة فوق بداية ملف نصي
سؤال
أملك:
<?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
تحصل على نفس فتح الملف للإلحاق
<?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);
?>