مدیریت فایلها در PHP قسمت دوم : مدیریت فایلها و پوشه ها

آبان ۳, ۱۳۹۱ توسط : سعید

در قسمت قبل با نحوه خواندن و نوشتن محتویات فایلهای متنی در PHP آشنا شدید.در این این قسمت به مدیریت فایلها و پوشه ها میپردازیم.

مباحثی که در این بخش خواهیم آموخت :

برای دسترسی به محتویات یک پوشه چندتا راه وجود داره.در زیر با این راه ها آشنا میشید.

تابع opendir

این تابع آدرس یک پوشه رو دریافت میکنه و یک اشاره گر رو برگشت میده که از این اشاره گر میتونیم در تابع readdir استفاده کنیم :

<?php 
    $location = './'; 
    $dp = opendir($location); 
    while ($entry = readdir($dp)) 
    {
        if (is_dir($location . $entry))
        {
            echo '[Dir] ' . $entry . '<br />';
        }
        else if (is_file($location . $entry))
        {
            echo '[File] ' . $entry . '<br />';
        } 
    } 
    closedir($dp); 
?>

در کد بالا ابتدا با استفاده از تابع opendir یک پوشه رو باز کردیم سپس در حلقه while و با استفاده ازتابع readdir محتویات پوشه رو یکی یکی در متغیر $entry ذخیره کردیم.

برای تشخیص اینکه آیا اشاره گر روی یک فایل قرار داره یا یک پوشه از توابع is_file و is_dir استفاده میکنیم.

تابع dir

خروجی این تابع یک شیء از کلاس  Directory میباشد و با استفاده از متدهای این کلاس میتونیم محتویات پوشه رو پیمایش کنیم

$location = './'; 
    $dir = dir($location); 
    while ($entry = $dir->read()) 
    {
        if (is_dir($location . $entry))
        {
            echo '[Dir] ' . $entry . '<br />';
        }
        else if (is_file($location . $entry))
        {
            echo '[File] ' . $entry . '<br />';
        } 
    }

کد بالا هم مثل مثال قبل نام فایلها و پوشه هارو چاپ میکنه.

تابع glob

در مورد این تابع قبلا در پست “ ۹ تابع سودمند php ” صحبت کردیم.

کپی کردن فایلها

برای کپی کردن فایلها از یک مکان به مکان دیگه از تابع copy استفاده میکنیم :

<?php
$file = 'example.txt';
$newfile = 'example.txt.bak';

if (!copy($file, $newfile)) {
    echo "failed to copy $file...\n";
}
?>

این تابع دو پارامتر ورودی میگیره.اولی مسیر و نام فایل مبدا و دومی مسیر فایل مقصد.دقت کنید که اگر فایل مقصد وجود داشته باشه فایل overwrite میشه.

اگر هم خطایی در هنگام کپی خطایی رخ بده این تابع مقدار false برمیگردونه.

حذف فایل

برای حذف فایل هم میتونید از تابع unlink استفاده کنید :

unlink('test.html');

برای چک کردن وجود یک فایل از تابع file_exists استفاده میشه.

if(file_exists('test.jpg')) {
 // ...
}

در ادامه یه کلاس ساده ساختم برای لیست کردن محتویات یک پوشه.

<?php
class FileManager
{

	private $path;

	function __construct($path = '')
	{
		$this->path = $path;
	}

	function getDirectories()
	{
	        $dirContent = array();
		$dir = opendir($this->path);
		while($contnets = readdir($dir))
		{
			if(is_dir($this->path . $contnets) AND $contnets!='.' AND $contnets != '..')
			{
				$dirContent['dir'][] = $contnets;			
			}elseif (is_file($this->path . $contnets))
			{
				$dirContent['file'][] = $contnets;
			}

		}

		return $dirContent;
	}

	function render()
	{

				$dirContent = $this->getDirectories();
                echo '<h1>'.$this->path.'</h1>';

                echo '<a href="?dir=./">Root Directory.</a><br>';

                $parent = explode('/',$this->path);
                array_pop($parent);
                array_pop($parent);
                $parent = implode('/',$parent);              
                echo '<a href="?dir='.$parent.'/">Parent Directory.</a><br>';
                echo 'Root ..
				<br>			
                <ul>    
                ';
                foreach($dirContent as $key=>$value)
                {
                    if($key=='dir')
                    {
                       foreach($value as $v)
                       {
                           echo '<li><a href="?dir='.$this->path.$v.'/">'.$v.'</a></li><br>';
                       }
                    }
                    else
                    {
                        echo '<ul>';
                       foreach($value as $v)
                       {
                           echo '<li><a href="'.$this->path . $v.'">'.$v.'</a></li><br>';
                       } 
                       echo '</ul>';
                    }

                }
                echo '<ul>';
	}

}

برای استفاده از کلاس بالا به صورت زیر عمل میکنیم :

<?php
include 'FileManager.php';
$path = '/files/';
if(isset($_GET['dir']))
{
    $path = $_GET['dir'];
    $fileManager = new FileManager($_GET['dir']);
}else
    $fileManager = new FileManager('./files/');

$fileManager->render();
?>

با استفاده از این کلاس میتونید لیست محتویات هر پوشه رو با کلیک روی پوشه مشاهده کنید.

منتظر نظراتتون هستم

موفق باشید

بازدید : ۹۱۸۸

ایوب سیستم
آبان ۴, ۱۳۹۱ @ ۱:۰۴ ق.ظ

سلام استاد سعید. واقعا ممنون . بسیار خوب توضیح داده شده بود…
استادیتون همیشه پایدار. . . ♥

پاسخ دادن
    سعید
    آبان ۴, ۱۳۹۱ @ ۱:۱۵ ق.ظ

    ممنون دوست عزیز
    من که هنوز تو این راه تازه کاری بیش نیستم.به امید خدا همه باهم به مرحله استادی برسیم.

    پاسخ دادن
محسن
آبان ۷, ۱۳۹۱ @ ۱۱:۱۷ ق.ظ

خیلی عالی بود یه دنیا ممنون

پاسخ دادن
آبان ۱۳, ۱۳۹۱ @ ۱۱:۴۳ ق.ظ

سلام
واقعاً عالی بود.

پاسخ دادن
رضا
آبان ۱۳, ۱۳۹۱ @ ۶:۳۴ ب.ظ

سلام
من یه مشکل دارم
میدونم نباید اینجا بگم ولی خیلی لازمه
من میخوام زمانی که یه صفحه با کدهای php یارگذاری میشه اول کدهای یه فایل دیگه داخلش اجرا بشه و بعد کدهای دیگه رو اجرا کنه
من از این کد استفاده کردم
require_once(‘file.php’);
اگه میشه کمک کنید

پاسخ دادن
    آبان ۲۲, ۱۳۹۱ @ ۱۱:۳۴ ب.ظ

    مدیریت فایلها مبحثی است که خیلی کم به اون توجه میشه. ممنون از اینکه این مطلب رو نوشتید.

    پاسخ دادن
آبان ۱۷, ۱۳۹۱ @ ۱۲:۰۸ ب.ظ

عالی بود بدردم خورد ممنون

پاسخ دادن
آذر ۹, ۱۳۹۱ @ ۶:۴۲ ق.ظ

آفرین مطالبتون خیلی عالی هست.

پاسخ دادن
دی ۱۷, ۱۳۹۱ @ ۱۱:۴۳ ق.ظ

سلام
خیلی عالی بود.
تابع scandir هم مانند readdir می توان محتویات پوشه را برگرداند ولی scandir را فقط با یک بار صدا زدن محتویات را نشان میدهد ولی readdir به حلقه نیاز دارد.

پاسخ دادن
    سعید
    دی ۱۷, ۱۳۹۱ @ ۱۱:۱۱ ب.ظ

    ممنون علی جان از توضیحاتت لطف کردی
    🙂

    پاسخ دادن
محسن
مرداد ۲۷, ۱۳۹۴ @ ۱۲:۰۲ ب.ظ

سلام ، من اگر بخوام نام فایل موجود روی هاست رو تغییر بدم باید چیکار کنم ؟

پاسخ دادن
    Saeed Moqadam
    شهریور ۷, ۱۳۹۴ @ ۵:۰۶ ب.ظ

    سلام
    از تابع rename استفاده کن :

    rename(&quot;/tmp/tmp_file.txt&quot;, &quot;/home/user/login/docs/my_file.txt&quot;);
    
    پاسخ دادن

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *


*