Kotchasan Framework Documentation

Kotchasan Framework Documentation

คลาส File - การจัดการไฟล์และไดเรกทอรี

TH 05 Feb 2026 07:40

คลาส File - การจัดการไฟล์และไดเรกทอรี

คลาส File เป็นยูทิลิตี้สำหรับจัดการไฟล์และไดเรกทอรี รองรับการคัดลอก, อ่าน, สร้าง และลบไดเรกทอรี

Namespace

Kotchasan\File

ภาพรวม

File class มีฟังก์ชัน:

  • คัดลอกไดเรกทอรีทั้งหมด (recursive)
  • ดึงนามสกุลไฟล์
  • แสดงรายการไฟล์ในไดเรกทอรีและไดเรกทอรีย่อย
  • สร้างไดเรกทอรีพร้อมตั้งค่าสิทธิ์
  • ลบไดเรกทอรีและไฟล์ทั้งหมด

API Reference

copyDirectory()

คัดลอกไดเรกทอรีและเนื้อหาทั้งหมด (recursive)

public static function copyDirectory(string $sourceDir, string $destDir): void

Parameters:

  • $sourceDir - path ไดเรกทอรีต้นทาง (ต้องมี / ท้าย)
  • $destDir - path ไดเรกทอรีปลายทาง (ต้องมี / ท้าย)

Returns: void

Example:

use Kotchasan\File;

// คัดลอกไดเรกทอรีทั้งหมด
File::copyDirectory('/path/to/source/', '/path/to/destination/');

// คัดลอก theme
File::copyDirectory(
    ROOT_PATH . 'themes/default/',
    ROOT_PATH . 'themes/custom/'
);

// Backup system
class BackupSystem
{
    public function backupTemplate($templateName)
    {
        $source = ROOT_PATH . "templates/{$templateName}/";
        $backup = ROOT_PATH . "backups/" . date('Y-m-d_His') . "_{$templateName}/";

        if (is_dir($source)) {
            File::makeDirectory($backup);
            File::copyDirectory($source, $backup);
            return "Backup created: {$backup}";
        }

        return "Source not found";
    }

    public function duplicateProject($projectName)
    {
        $source = ROOT_PATH . "projects/{$projectName}/";
        $newName = $projectName . '_copy';
        $dest = ROOT_PATH . "projects/{$newName}/";

        File::copyDirectory($source, $dest);

        return "Project duplicated: {$newName}";
    }
}

// ระบบ theme installer
class ThemeInstaller
{
    public function install($themeName)
    {
        $source = ROOT_PATH . "downloads/{$themeName}/";
        $dest = ROOT_PATH . "themes/{$themeName}/";

        if (!is_dir($source)) {
            return ['error' => 'Theme package not found'];
        }

        // คัดลอก theme
        File::copyDirectory($source, $dest);

        // ลบ package
        File::removeDirectory($source);

        return ['success' => "Theme {$themeName} installed"];
    }
}

ext()

ดึงนามสกุลไฟล์ (file extension)

public static function ext(string $path): string

Parameters:

  • $path - path หรือชื่อไฟล์

Returns: นามสกุลไฟล์ (ตัวพิมพ์เล็ก)

Example:

use Kotchasan\File;

// Basic usage
echo File::ext('config.php');              // "php"
echo File::ext('image.JPG');               // "jpg"
echo File::ext('document.pdf');            // "pdf"
echo File::ext('/path/to/file.txt');       // "txt"
echo File::ext('archive.tar.gz');          // "gz"

// ตรวจสอบประเภทไฟล์
function isImageFile($filename)
{
    $imageExts = ['jpg', 'jpeg', 'png', 'gif', 'webp'];
    return in_array(File::ext($filename), $imageExts);
}

echo isImageFile('photo.jpg') ? 'Yes' : 'No';  // "Yes"
echo isImageFile('document.pdf') ? 'Yes' : 'No';  // "No"

// File upload validation
class FileUpload
{
    private $allowedExts = ['jpg', 'png', 'pdf', 'doc', 'docx'];

    public function validate($filename)
    {
        $ext = File::ext($filename);

        if (!in_array($ext, $this->allowedExts)) {
            return [
                'valid' => false,
                'error' => "File type .{$ext} not allowed"
            ];
        }

        return ['valid' => true];
    }

    public function getFileType($filename)
    {
        $ext = File::ext($filename);

        $types = [
            'jpg' => 'image', 'png' => 'image', 'gif' => 'image',
            'pdf' => 'document', 'doc' => 'document', 'docx' => 'document',
            'mp4' => 'video', 'avi' => 'video',
            'mp3' => 'audio', 'wav' => 'audio'
        ];

        return $types[$ext] ?? 'unknown';
    }
}

$upload = new FileUpload();
echo $upload->getFileType('photo.jpg');  // "image"
echo $upload->getFileType('report.pdf'); // "document"

// File icon mapping
class FileIcon
{
    public static function getIcon($filename)
    {
        $ext = File::ext($filename);

        $icons = [
            'php' => '📄', 'js' => '📜', 'css' => '🎨',
            'jpg' => '🖼️', 'png' => '🖼️', 'gif' => '🖼️',
            'pdf' => '📕', 'doc' => '📘', 'xls' => '📊',
            'zip' => '📦', 'rar' => '📦',
            'mp4' => '🎬', 'mp3' => '🎵'
        ];

        return $icons[$ext] ?? '📄';
    }
}

echo FileIcon::getIcon('photo.jpg');   // "🖼️"
echo FileIcon::getIcon('music.mp3');   // "🎵"

listFiles()

แสดงรายการไฟล์ทั้งหมดในไดเรกทอรีและไดเรกทอรีย่อย

public static function listFiles(
    string $dir,
    array &$result,
    array $filter = []
): void

Parameters:

  • $dir - path ไดเรกทอรี (ต้องมี / ท้าย)
  • $result - array สำหรับเก็บผลลัพธ์ (pass by reference)
  • $filter - array นามสกุลไฟล์ที่ต้องการ (optional, ตัวพิมพ์เล็ก)

Returns: void (ผลลัพธ์อยู่ใน $result)

Example:

use Kotchasan\File;

// แสดงไฟล์ทั้งหมด
$files = [];
File::listFiles('/path/to/directory/', $files);
print_r($files);

// กรองเฉพาะไฟล์ PHP
$phpFiles = [];
File::listFiles(ROOT_PATH . 'app/', $phpFiles, ['php']);
foreach ($phpFiles as $file) {
    echo $file . "\n";
}

// หาไฟล์รูปภาพทั้งหมด
$images = [];
File::listFiles(ROOT_PATH . 'uploads/', $images, ['jpg', 'png', 'gif']);
echo "Found " . count($images) . " images\n";

// ระบบค้นหาไฟล์
class FileSearch
{
    public function findByExtension($dir, $extensions)
    {
        $files = [];
        File::listFiles($dir, $files, $extensions);
        return $files;
    }

    public function findByPattern($dir, $pattern)
    {
        $allFiles = [];
        File::listFiles($dir, $allFiles);

        return array_filter($allFiles, function($file) use ($pattern) {
            return strpos(basename($file), $pattern) !== false;
        });
    }

    public function getFileStats($dir)
    {
        $files = [];
        File::listFiles($dir, $files);

        $stats = [
            'total' => count($files),
            'size' => 0,
            'types' => []
        ];

        foreach ($files as $file) {
            $stats['size'] += filesize($file);
            $ext = File::ext($file);
            $stats['types'][$ext] = ($stats['types'][$ext] ?? 0) + 1;
        }

        return $stats;
    }
}

// Code analyzer
class CodeAnalyzer
{
    public function countLines($dir)
    {
        $phpFiles = [];
        File::listFiles($dir, $phpFiles, ['php']);

        $totalLines = 0;
        foreach ($phpFiles as $file) {
            $lines = count(file($file));
            $totalLines += $lines;
        }

        return [
            'files' => count($phpFiles),
            'lines' => $totalLines,
            'average' => round($totalLines / max(count($phpFiles), 1))
        ];
    }
}

// Media library
class MediaLibrary
{
    public function getImages($uploadDir)
    {
        $images = [];
        File::listFiles($uploadDir, $images, ['jpg', 'jpeg', 'png', 'gif', 'webp']);

        $result = [];
        foreach ($images as $path) {
            $result[] = [
                'path' => $path,
                'name' => basename($path),
                'size' => filesize($path),
                'modified' => filemtime($path)
            ];
        }

        return $result;
    }
}

makeDirectory()

สร้างไดเรกทอรีพร้อมตรวจสอบสิทธิ์การเขียน

public static function makeDirectory(string $dir, int $mode = 0755): bool

Parameters:

  • $dir - path ไดเรกทอรีที่ต้องการสร้าง
  • $mode - permission mode (default: 0755)

Returns: true = สร้างสำเร็จและเขียนได้, false = ล้มเหลว

Example:

use Kotchasan\File;

// สร้างไดเรกทอรีพื้นฐาน
$success = File::makeDirectory('/path/to/newdir/');
if ($success) {
    echo "Directory created";
} else {
    echo "Failed to create directory";
}

// สร้างด้วย permission ที่กำหนด
File::makeDirectory('/path/to/dir/', 0777);  // Full permission
File::makeDirectory('/path/to/dir/', 0755);  // Owner rwx, others rx

// Upload system
class UploadManager
{
    public function prepareUploadDirectory($userId)
    {
        $userDir = ROOT_PATH . "uploads/user_{$userId}/";

        if (!File::makeDirectory($userDir)) {
            return ['error' => 'Cannot create upload directory'];
        }

        // สร้างโครงสร้างไดเรกทอรี
        File::makeDirectory($userDir . 'images/');
        File::makeDirectory($userDir . 'documents/');
        File::makeDirectory($userDir . 'videos/');

        return ['success' => 'Upload directory ready'];
    }
}

// Cache system
class CacheManager
{
    private $cacheDir;

    public function __construct()
    {
        $this->cacheDir = ROOT_PATH . 'storage/cache/';
        File::makeDirectory($this->cacheDir);
    }

    public function write($key, $data, $ttl = 3600)
    {
        $file = $this->cacheDir . md5($key) . '.cache';

        $cacheData = [
            'expires' => time() + $ttl,
            'data' => $data
        ];

        file_put_contents($file, serialize($cacheData));
    }

    public function read($key)
    {
        $file = $this->cacheDir . md5($key) . '.cache';

        if (!file_exists($file)) {
            return null;
        }

        $cacheData = unserialize(file_get_contents($file));

        if ($cacheData['expires'] < time()) {
            unlink($file);
            return null;
        }

        return $cacheData['data'];
    }
}

// Log system
class Logger
{
    private $logDir;

    public function __construct()
    {
        $this->logDir = ROOT_PATH . 'storage/logs/';

        if (!File::makeDirectory($this->logDir)) {
            throw new \Exception('Cannot create log directory');
        }
    }

    public function log($level, $message)
    {
        $date = date('Y-m-d');
        $logFile = $this->logDir . "{$level}_{$date}.log";

        $entry = sprintf(
            "[%s] [%s] %s\n",
            date('Y-m-d H:i:s'),
            strtoupper($level),
            $message
        );

        file_put_contents($logFile, $entry, FILE_APPEND);
    }
}

removeDirectory()

ลบไดเรกทอรีและไฟล์ทั้งหมด (recursive)

public static function removeDirectory(string $dir, bool $removeSelf = true): void

Parameters:

  • $dir - path ไดเรกทอรีที่ต้องการลบ (ต้องมี / ท้าย)
  • $removeSelf - true = ลบไดเรกทอรีด้วย, false = ลบแต่ไฟล์ข้างใน

Returns: void

Example:

use Kotchasan\File;

// ลบไดเรกทอรีทั้งหมด
File::removeDirectory('/path/to/directory/');

// ลบเฉพาะไฟล์ข้างใน (เก็บไดเรกทอรีไว้)
File::removeDirectory('/path/to/cache/', false);

// Cleanup system
class CleanupManager
{
    public function clearCache()
    {
        $cacheDir = ROOT_PATH . 'storage/cache/';

        // ลบไฟล์แคชทั้งหมด แต่เก็บไดเรกทอรีไว้
        File::removeDirectory($cacheDir, false);

        return "Cache cleared";
    }

    public function clearOldLogs($daysOld = 30)
    {
        $logDir = ROOT_PATH . 'storage/logs/';
        $files = [];
        File::listFiles($logDir, $files, ['log']);

        $cutoff = time() - ($daysOld * 86400);
        $removed = 0;

        foreach ($files as $file) {
            if (filemtime($file) < $cutoff) {
                unlink($file);
                $removed++;
            }
        }

        return "Removed {$removed} old log files";
    }

    public function clearTempFiles()
    {
        $tempDir = ROOT_PATH . 'storage/temp/';
        File::removeDirectory($tempDir, false);

        return "Temp files cleared";
    }
}

// Uninstaller
class ModuleUninstaller
{
    public function uninstall($moduleName)
    {
        $moduleDir = ROOT_PATH . "modules/{$moduleName}/";

        if (!is_dir($moduleDir)) {
            return ['error' => 'Module not found'];
        }

        // ลบไดเรกทอรีโมดูลทั้งหมด
        File::removeDirectory($moduleDir);

        return ['success' => "Module {$moduleName} uninstalled"];
    }

    public function reset($moduleName)
    {
        $dataDir = ROOT_PATH . "modules/{$moduleName}/data/";

        // ลบข้อมูล แต่เก็บโครงสร้างไว้
        File::removeDirectory($dataDir, false);

        return ['success' => "Module {$moduleName} reset"];
    }
}

// Backup rotation
class BackupRotation
{
    private $backupDir;
    private $maxBackups = 5;

    public function __construct($backupDir)
    {
        $this->backupDir = $backupDir;
        File::makeDirectory($backupDir);
    }

    public function rotate()
    {
        $backups = [];
        File::listFiles($this->backupDir, $backups);

        // เรียงตามเวลา (เก่าสุดก่อน)
        usort($backups, function($a, $b) {
            return filemtime($a) - filemtime($b);
        });

        // ลบ backup เก่าเกินจำนวนที่กำหนด
        $toRemove = count($backups) - $this->maxBackups;
        if ($toRemove > 0) {
            for ($i = 0; $i < $toRemove; $i++) {
                if (is_dir($backups[$i])) {
                    File::removeDirectory($backups[$i]);
                } else {
                    unlink($backups[$i]);
                }
            }
        }

        return "Kept latest {$this->maxBackups} backups";
    }
}

ตัวอย่างการใช้งานจริง

1. ระบบ Asset Compiler

use Kotchasan\File;

class AssetCompiler
{
    public function compileAssets()
    {
        $sourceDir = ROOT_PATH . 'resources/';
        $buildDir = ROOT_PATH . 'public/assets/';

        // สร้างไดเรกทอรี build
        File::makeDirectory($buildDir);

        // ล้าง build เดิม
        File::removeDirectory($buildDir, false);

        // หา CSS files
        $cssFiles = [];
        File::listFiles($sourceDir . 'css/', $cssFiles, ['css']);

        // หา JS files
        $jsFiles = [];
        File::listFiles($sourceDir . 'js/', $jsFiles, ['js']);

        // Compile CSS
        $this->compileCss($cssFiles, $buildDir . 'app.css');

        // Compile JS
        $this->compileJs($jsFiles, $buildDir . 'app.js');

        // คัดลอกรูปภาพ
        File::copyDirectory(
            $sourceDir . 'images/',
            $buildDir . 'images/'
        );

        return "Assets compiled successfully";
    }

    private function compileCss($files, $output)
    {
        $combined = '';
        foreach ($files as $file) {
            $combined .= file_get_contents($file) . "\n";
        }
        file_put_contents($output, $combined);
    }

    private function compileJs($files, $output)
    {
        $combined = '';
        foreach ($files as $file) {
            $combined .= file_get_contents($file) . ";\n";
        }
        file_put_contents($output, $combined);
    }
}

2. ระบบ File Manager

class FileManager
{
    private $baseDir;

    public function __construct($baseDir)
    {
        $this->baseDir = rtrim($baseDir, '/') . '/';
        File::makeDirectory($this->baseDir);
    }

    public function listDirectory($path = '')
    {
        $fullPath = $this->baseDir . $path;

        if (!is_dir($fullPath)) {
            return ['error' => 'Directory not found'];
        }

        $items = [];
        $handle = opendir($fullPath);

        while (false !== ($item = readdir($handle))) {
            if ($item === '.' || $item === '..') {
                continue;
            }

            $itemPath = $fullPath . $item;
            $isDir = is_dir($itemPath);

            $items[] = [
                'name' => $item,
                'type' => $isDir ? 'directory' : 'file',
                'size' => $isDir ? null : filesize($itemPath),
                'extension' => $isDir ? null : File::ext($item),
                'modified' => filemtime($itemPath)
            ];
        }

        closedir($handle);
        return $items;
    }

    public function createDirectory($path)
    {
        $fullPath = $this->baseDir . $path . '/';

        if (File::makeDirectory($fullPath)) {
            return ['success' => 'Directory created'];
        }

        return ['error' => 'Cannot create directory'];
    }

    public function deleteDirectory($path)
    {
        $fullPath = $this->baseDir . $path . '/';

        File::removeDirectory($fullPath);
        return ['success' => 'Directory deleted'];
    }

    public function copyDirectory($source, $dest)
    {
        $sourcePath = $this->baseDir . $source . '/';
        $destPath = $this->baseDir . $dest . '/';

        File::makeDirectory($destPath);
        File::copyDirectory($sourcePath, $destPath);

        return ['success' => 'Directory copied'];
    }
}

Best Practices

1. ใช้ Trailing Slash

// ✅ Good - มี trailing slash
File::copyDirectory('/path/to/source/', '/path/to/dest/');
File::listFiles('/path/to/dir/', $files);

// ❌ Bad - ไม่มี trailing slash (อาจทำงานผิดพลาด)
File::copyDirectory('/path/to/source', '/path/to/dest');

2. ตรวจสอบสิทธิ์ก่อนใช้งาน

// ✅ Good
if (File::makeDirectory($dir)) {
    // ดำเนินการต่อ
} else {
    // จัดการ error
}

// ❌ Bad
File::makeDirectory($dir); // ไม่เช็ค return value

3. ระมัดระวังเมื่อลบไดเรกทอรี

// ✅ Good - มีการยืนยัน
function deleteUserData($userId)
{
    $confirm = readline("Delete all data for user {$userId}? (yes/no): ");
    if ($confirm === 'yes') {
        File::removeDirectory("/data/users/{$userId}/");
    }
}

// ❌ Bad - ลบทันทีโดยไม่ยืนยัน
File::removeDirectory($dir); // อันตราย!

4. กรองนามสกุลไฟล์

// ✅ Good - กรองเฉพาะที่ต้องการ
$images = [];
File::listFiles($dir, $images, ['jpg', 'png']);

// ❌ Bad - ได้ไฟล์ทั้งหมด
$all = [];
File::listFiles($dir, $all);  // อาจมีไฟล์ไม่ต้องการ

ข้อควรระวัง

[!WARNING]
removeDirectory(): ลบไฟล์ถาวร ไม่สามารถกู้คืนได้ ใช้ระมัดระวัง

[!IMPORTANT]
Permissions: ตรวจสอบว่ามีสิทธิ์เขียน/ลบไฟล์ในระบบปฏิบัติการ

[!NOTE]
Trailing Slash: Methods ที่รับ directory path ต้องมี / ท้าย

[!TIP]
Error Handling: ใช้ @ เพื่อซ่อน warning แต่ควรเช็ค return values

คลาสที่เกี่ยวข้อง

  • [Files] - File upload และ validation
  • Image - Image processing

สรุป

File class มี 5 เมธอดหลัก:

  1. copyDirectory() - คัดลอกไดเรกทอรีทั้งหมด
  2. ext() - ดึงนามสกุลไฟล์
  3. listFiles() - แสดงรายการไฟล์ (รองรับกรอง)
  4. makeDirectory() - สร้างไดเรกทอรีพร้อมตั้งค่าสิทธิ์
  5. removeDirectory() - ลบไดเรกทอรีและไฟล์

เหมาะสำหรับ:

  • ระบบจัดการไฟล์
  • Backup/Restore systems
  • Asset compilation
  • Cache management
  • Module/Plugin systems