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

اکتبر 24, 2012 توسط : سعید

در قسمت قبل با نحوه خواندن و نوشتن محتویات فایلهای متنی در 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

در مورد این تابع قبلا در پست “ 9 تابع سودمند 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();
?>

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

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

موفق باشید

ایوب سیستم
اکتبر 25, 2012 @ 1:04 ق.ظ

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

پاسخ
    سعید
    اکتبر 25, 2012 @ 1:15 ق.ظ

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

    پاسخ
محسن
اکتبر 28, 2012 @ 11:17 ق.ظ

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

پاسخ
نوامبر 3, 2012 @ 11:43 ق.ظ

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

پاسخ
رضا
نوامبر 3, 2012 @ 6:34 ب.ظ

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

پاسخ
    نوامبر 12, 2012 @ 11:34 ب.ظ

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

    پاسخ
نوامبر 7, 2012 @ 12:08 ب.ظ

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

پاسخ
نوامبر 29, 2012 @ 6:42 ق.ظ

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

پاسخ
ژانویه 6, 2013 @ 11:43 ق.ظ

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

پاسخ
    سعید
    ژانویه 6, 2013 @ 11:11 ب.ظ

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

    پاسخ
محسن
آگوست 18, 2015 @ 12:02 ب.ظ

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

پاسخ
    Saeed Moqadam
    آگوست 29, 2015 @ 5:06 ب.ظ

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

    [php]
    rename(&quot;/tmp/tmp_file.txt&quot;, &quot;/home/user/login/docs/my_file.txt&quot;);
    [/php]

    پاسخ

دیدگاهتان را بنویسید

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


*