کار با فایل ها: Open/Read

04 مرداد 1398
درسنامه درس 17 از سری آموزش PHP 7

کار با فایل ها

مدیریت و کار با فایل ها بخش بسیار مهمی از هر برنامه ای است. در بسیاری از برنامه ها نیاز به باز کردن و ویرایش برخی از فایل ها داریم. همانطور که حدس میزدید PHP نیز توابع مختلفی برای کار با فایل ها دارد البته باید به شما هشدار بدهم که در هنگام کار با فایل ها به شدت مراقب باشید! کوچکترین اشتباهات می توانند منجر به بزرگترین ضررها و هزینه ها شوند. معمولا رایج ترین اشتباهات هنگام کار با فایل ها عبارت اند از:

  • ویرایش فایل اشتباه
  • پر کردن یک درایو با داده های به درد نخور و اضافی
  • حذف محتوای یک فایل به اشتباه

تابع ()readfile در PHP یک فایل را می خواند و آن را به output buffer میفرستد. فرض کنید فایلی به نام webdictionary.txt داشته باشیم که محتوای زیر را داشته باشد:

AJAX = Asynchronous JavaScript and XML
CSS = Cascading Style Sheets
HTML = Hyper Text Markup Language
PHP = PHP Hypertext Preprocessor
SQL = Structured Query Language
SVG = Scalable Vector Graphics
XML = EXtensible Markup Language

حالا برای خواندن این فایل می توان گفت:

<!DOCTYPE html>
<html>
<body>

<?php
echo readfile("webdictionary.txt");
?>

</body>
</html>

مشاهده ی خروجی

نکته: در آخر این فایل عدد 236 را مشاهده می کنید. این عدد حجم فایل به بایت است که توسط تابع ()readfile در آخر خروجی برگردانده می شود. البته در صورتی که عملیات خواندن موفقیت آمیز باشد.

اما این روش آنقدرها هم جالب نیست. روش بهتر برای باز کردن فایل ها و خواند محتویاتشان استفاده از تابع ()fopen است چرا که گزینه های بیشتری به شما می دهد. برای نمایش قدرت دوباره تابع ()fopen با همان فایل webdictionary.txt کار خواهیم کرد.

اولین پارامتر ()fopen نام فایلی است که باید باز شود و پارامتر دوم می گوید از کدام mode برای باز کردن آن استفاده شود. در مثال زیر از تابع die نیز استفاده کرده ایم تا در صورت مواجهه با خطا پیامی مبنی بر عدم موفقیت نمایش داده شود:

<!DOCTYPE html>
<html>
<body>

<?php
$myfile = fopen("webdictionary.txt", "r") or die("Unable to open file!");
echo fread($myfile,filesize("webdictionary.txt"));
fclose($myfile);
?>

</body>
</html>

مشاهده ی خروجی

نگران نباشید! در مورد توابع fread و fclose توضیح خواهیم داد.

همانطور که می بینید در این مثال به پارامتر دوم fopen حرف r را داده ایم که یکی از mode (حالت) های آن است. لیست کامل mode های این تابع را در جدول زیر مشاهده می کنید:

Mode توضیحات
r فایل را فقط برای خواندن (read) باز می کند. pointer از اول فایل شروع می شود.
w فایل را فقط برای نوشتن (write) باز می کند. pointer از اول فایل شروع می شود. همچنین محتوای فایل را پاک کرده و اگر فایل را پیدا نکند یک فایل دیگر می سازد.
a فایل را فقط برای نوشتن (write) باز می کند. pointer از آخر فایل شروع می شود. محتوای قبلی فایل را پاک نمی‌کند و اگر فایل را پیدا نکند یک فایل دیگر می سازد.
x یک فایل جدید برای نوشتن (Write) می سازد. اگر فایل از قبل وجود داشته باشد FALSE و یک پیام خطا را به ما برمیگرداند.
+r فایل را برای خواندن (read) و نوشتن (write) باز می کند. pointer از اول فایل شروع می شود.
+w فایل را برای خواندن (read) و نوشتن (write) باز می کند. pointer از اول فایل شروع می شود. همچنین محتوای فایل را پاک کرده و اگر فایل را پیدا نکند یک فایل دیگر می سازد.
+a فایل را برای خواندن (read) و نوشتن (write) باز می کند. pointer از آخر فایل شروع می شود. محتوای قبلی فایل را پاک نمی‌کند و اگر فایل را پیدا نکند یک فایل دیگر می سازد.
+x یک فایل جدید برای خواندن (read) و نوشتن (Write) می سازد. اگر فایل از قبل وجود داشته باشد FALSE و یک پیام خطا را به ما برمیگرداند.

توابع دیگر کار با فایل ها

1. fread

تابع ()fread محتوای یک فایل باز شده (قبلا با دستور fopen باز شده باشد) را می خواند. اولین پارامتر آن نام فایل و دومین پارامتر حداکثر تعداد بایت هایی است که باید خوانده شوند. به طور مثال اگر بخواهیم فایل webdictionary.txt را با این دستور بخوانیم می گوییم:

fread($myfile,filesize("webdictionary.txt"));

2. fclose

تابع ()fclose برای بستن یک فایل باز شده استفاده می شود. همیشه بعد از اتمام کارتان با یک فایل آن را ببندید و گرنه آن فایل در پس زمینه ی برنامه باز مانده و منابع سیستمی شما را هدر می دهد. مثال زیر فایل webdictionary.txt را می بندد:

<?php
$myfile = fopen("webdictionary.txt", "r");
// some code to be executed....
fclose($myfile);
?>

3. fgets

تابع ()fgets فقط یک خط از یک فایل را می خواند. مثال زیر اولین خط از فایل webdictionary.txt را برای ما می خواند:

<!DOCTYPE html>
<html>
<body>

<?php
$myfile = fopen("webdictionary.txt", "r") or die("Unable to open file!");
echo fgets($myfile);
fclose($myfile);
?>

</body>
</html>

مشاهده ی خروجی

نکته ی مهم: حواستان باشد که پس از صدا زدن ()fgets موقعیت pointer فایل به خط بعدی منتقل می شود. pointer فایل نقطه ای فرضی است که برای درک بهتر می توانید آن را دقیقا معادل علامت Caret navigation یا text cursor در نظر بگیرید (تعیین مکان فعلی).

علامت Text cursor یا همان Caret navigation (خط عمودی چشمک زن)
علامت Text cursor یا همان Caret navigation (خط عمودی چشمک زن)

4. feof

تابع ()feof چک می کند تا ببیند به EOF (همان end-of-file) رسیده ایم یا خیر. از این تابع معمولا برای گردش در فایل هایی استفاده می شود که نمی دانیم حجمشان چقدر است. مثال زیر فایل webdictionary.txt را خط به خط می خواند تا به end-of-file برسد:

<!DOCTYPE html>
<html>
<body>

<?php
$myfile = fopen("webdictionary.txt", "r") or die("Unable to open file!");
// Output one line until end-of-file
while(!feof($myfile)) {
  echo fgets($myfile) . "<br>";
}
fclose($myfile);
?>

</body>
</html>

مشاهده ی خروجی

5. fgetc

تابع ()fgetc تنها یک کاراکتر از یک خط را می خواند. مثال زیر فایل webdictionary.txt را کاراکتر به کاراکتر می خواند تا زمانی که به end-of-file برسیم:

<!DOCTYPE html>
<html>
<body>

<?php
$myfile = fopen("webdictionary.txt", "r") or die("Unable to open file!");
// Output one character until end-of-file
while(!feof($myfile)) {
  echo fgetc($myfile);
}
fclose($myfile);
?>

</body>
</html>

مشاهده ی خروجی

نکته: پس از یک بار صدا کردن ()fgetc موقعیت pointer ما به کاراکتر بعدی منتقل می شود.

امیدوارم از مقاله کار با فایل ها در php لذت برده باشید.

تمام فصل‌های سری ترتیبی که روکسو برای مطالعه‌ی دروس سری آموزش PHP 7 توصیه می‌کند:
نویسنده شوید

دیدگاه‌های شما (1 دیدگاه)

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

امیر
07 خرداد 1399
عالی بود

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.