คุณเคยประสบปัญหากับไฟล์ที่สร้างโดย PHP แล้วไม่สามารถลบได้ผ่าน FTP หรือ SSH ใช่หรือไม่? ผมขอแนะนำ Unlinker ซึ่งเป็น PHP Script ที่จะ Recursive เข้าไปลบ File และ Directory ทั้งหมดที่อยู่ใน Level เดียวกันและต่ำกว่าครับ ซึ่ง Script ตัวนี้ผมเขียนไว้เมื่อนานมาแล้ว ตั้งแต่เพิ่งเริ่มศึกษา PHP ใหม่ๆ (ดังนั้น Code เลยดูไม่ค่อยสวยเท่าไหร่) แต่พบว่ามันก็ยังมีประโยชน์อยู่เรื่อยๆ เวลาต้องทำงานกับระบบไฟล์ด้วย PHP หรือเวลาที่ CMS ทั้งหลายมันดันสร้างไฟล์ไม่พึงประสงค์ออกมา เลยเอาลองมาแจกดู เผื่อจะมีประโยชน์กับคนอื่นบ้างครับ

เวลาจะใช้ก็โยนมันไปไว้บน Server แล้วเรียก Script นี้ จากนั้นกดปุ่มยืนยันอีกรอบนึง แค่นี้ก็เรียบร้อยแล้วครับ ไม่ต้องแจ้งให้ Admin คอยลบอีกต่อไป

<!--

    Unlinker

    Copyright (c) 2010 Pongsakorn U-chupala

     Permission is hereby granted, free of charge, to any person obtaining a copy
     of this software and associated documentation files (the "Software"), to deal
     in the Software without restriction, including without limitation the rights
     to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
     copies of the Software, and to permit persons to whom the Software is
     furnished to do so, subject to the following conditions:

     The above copyright notice and this permission notice shall be included in
     all copies or substantial portions of the Software.

     THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
     AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
     LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
     OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
     THE SOFTWARE.

-->
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
    <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
    <title>Unlinker</title>
</head>
<body>
    <!-- Confirmation form -->
    <form method="post" action="<?php print $_SERVER['PHP_SELF']; ?>">
        <input type="submit" name="confirm" id="confirm" value="Delete 'Em ALL!" />
    </form>

<?php

// Define constants
define("SEPERATOR", "/"); // Unix's Seperator, should work fine on Windows as well
//define("SEPERATOR", "\\"); // Windows' Seperator
define("SELF", basename($_SERVER["SCRIPT_NAME"]));

/**
 * Indent
 *
 * @param string $level
 * @param string $indent
 * @return void
 * @author Pongsakorn U-chupala
 */
function indent($level=0, $indent="&nbsp;&nbsp;&nbsp;&nbsp;")
{
    // Initialize output
    $output = "";

    // Loop adding indent
    for ( $i=0; $i < $level; $i++ )
    {
        $output .= $indent;
    }

    // return indent
    return $output;
}

/**
 * Unlinker
 *
 * @param string $dir
 * @param string $level
 * @return void
 * @author Pongsakorn U-chupala
 */
function unlinker($dir, $level=0)
{
    // Get variables
    $indent = indent($level);
    $sep = SEPERATOR;
    // Try open directory
    if ($dh = opendir($dir))
    {
        print $indent . "<b>Open directory:</b> $dir" . "<br />";
        // Loop throuth each items in directory
        while (($file = readdir($dh)) !== false)
        {
            switch($file)
            {
                // Skip backward dir
                case ".": continue; break;
                case "..": continue; break;

                default:
                    switch( filetype("$dir$sep$file") )
                    {
                        // This item is 'dir', recursive through it.
                        case "dir":
                            unlinker("$dir$sep$file", $level+1);
                            break;

                        // This item is file
                        case "file":
                            // A quick-check to prevent deletion of self script.
                            if ( ($level==0) && ($file==SELF) )
                            {
                                // This item is self script, skip it.
                                print $indent . "<span style='color: green;'><b>Skip self:</b> $dir$sep$file</span>" . "<br />";
                            }
                            else
                            {
                                // DELETE!
                                if ( unlink("$dir$sep$file") )
                                    // File deletion SUCCESS
                                    print $indent . "<span style='color: blue;'><b>Delete file:</b> $file</span>" . "<br />";
                                else
                                    // File deletion FAILED
                                    print $indent . "<span style='color: red;'><b>Failed to delete file:</b> $file</span>" . "<br />";
                            }
                            break;

                        // This code shouldn't have been reached so it must be an unknow error.
                        default:
                            print $indent . "<span style='color: red;'><b>Unknow error:</b> $dir$sep$file</span>" . "<br />";
                            break;
                    }
                    break;
            }
        }

        // Close directory
        closedir($dh);

        // Delete directory if it's not self directory
        if ($level != 0)
            if ( rmdir("$dir$sep$file") )
                // Directory deletion SUCCESS
                print $indent . "<span style='color: blue;'><b>Delete directory:</b> $dir$sep$file</span>" . "<br />";
            else
                // Directory deletion FAILED
                print $indent . "<span style='color: red;'><b>Failed to delete directory:</b> $dir$sep$file</span>" . "<br />";
    }
    else
    {
        print $indent . "<span style='color: blue;'>Failed to open directory: $dir</span>" . "<br />";
    }
}

// If the confirmation button has been clicked, call unlinker()
if ( isset($_POST['confirm']) )
    // Unlink current directory and all it's subdirectory
    unlinker(getcwd());

?>

</body>
</html>

ป.ล. อยากลองใช้พวก License มานานแล้ว เลยเอา MIT License มาใส่ดู ไม่รู้ว่าเหมาะสมรึเปล่านะครับ

ป.ล. 2 ไม่รู้จะเลือกภาพเปิดยังไงให้เข้ากับเนื้อหา สุดท้ายเลยเลือกภาพ Sakuya ตอนทำความสะอาดมา แถให้มันเข้ากับ Theme การเก็บกวาดไฟล์แล้วกันครับ เหอะๆ