Ves al contingut principal

Gestió carpetes i arxius

Gestió de directoris

Funció Propòsit Sintaxi Bàsica Notes Clau
mkdir() Crear un nou directori. mkdir(string $path, int $mode = 0777, bool $recursive = false) Utilitza el mode 0777 (permisos de lectura, escriptura i execució per a tothom) o un més restrictiu. $recursive=true permet crear directoris imbricats (p. ex., mkdir('a/b/c', 0777, true)).
rmdir() Esborrar un directori. rmdir(string $path) NOMÉS funciona si la carpeta està completament buida. Per esborrar directoris amb contingut, cal recórrer-lo abans (veure scandir()).
is_dir() Comprovar si una ruta és un directori. is_dir(string $path) Retorna true si la ruta existeix i és un directori.

Gestió d'arxius: Moviment i eliminació

Funció Propòsit Sintaxi Bàsica Notes Clau
rename() Moure o canviar el nom d'un fitxer/directori. rename(string $old_name, string $new_name) Si la nova ruta ($new_name) inclou un directori diferent, mou el fitxer. Si només canvia l'última part, canvia el nom. Retorna true en cas d'èxit.
copy() Copiar un fitxer. copy(string $source, string $dest) Crea una còpia idèntica del fitxer a una nova ubicació.
unlink() Esborrar un fitxer. unlink(string $filename) Aquesta és la funció clàssica per esborrar arxius.
file_exists() Comprovar si un fitxer o directori existeix. file_exists(string $path) Molt útil abans de llegir, escriure o esborrar.
is_file() Comprovar si una ruta és un fitxer. is_file(string $path) Retorna true si la ruta existeix i és un fitxer.

Exemple de moviment

PHP
$origen = 'temp/imatge_temporal.jpg';
$desti = 'uploads/imatge_final.jpg';

if (rename($origen, $desti)) {
    echo "Fitxer mogut correctament.";
} else {
    echo "Error en moure el fitxer. Revisa permisos.";
}

Recorrer directoris

Per veure el contingut d'una carpeta, s'utilitzen principalment dues funcions:

Lectura ràpida (scandir())

Aquesta funció llegeix tots els elements d'un directori i els retorna en un array.

  • Avantatge: Ràpida i senzilla d'utilitzar.

  • Inconvenient: Inclou sempre els directoris especials . (directori actual) i .. (directori pare), que cal excloure manualment.

PHP
$carpeta = 'uploads/';
$elements = scandir($carpeta);

echo "<h2>Contingut de 'uploads/'</h2>";
foreach ($elements as $element) {
    if ($element !== '.' && $element !== '..') {
        echo $element . "<br>";
    }
}

Recorregut orientat a objectes (DirectoryIterator)

Per a una gestió més complexa i orientada a objectes, es pot utilitzar la classe DirectoryIterator (o RecursiveDirectoryIterator per a subdirectoris).

  • Avantatge: Proporciona mètodes per comprovar si l'element és un fitxer, un directori, la seva mida, la data de modificació, etc., de manera més fàcil que amb les funcions de PHP pures.

PHP
$iterator = new DirectoryIterator('uploads/');

echo "<h2>Contingut amb DirectoryIterator</h2>";
foreach ($iterator as $fitxer) {
    if ($fitxer->isFile()) {
        echo "Fitxer: " . $fitxer->getFilename() . " (" . $fitxer->getSize() . " bytes)<br>";
    }
}

Quan treballes amb iteradors de fitxers i directoris a PHP, les classes més comunes són DirectoryIterator i SplFileInfo (de la qual DirectoryIterator hereta gran part de les seves funcionalitats). Aquestes classes et proporcionen un conjunt ric de mètodes orientats a objectes per obtenir informació detallada sobre cada fitxer o carpeta sense haver de cridar funcions de PHP pures (filesize(), is_file(), etc.).

Mètodes de l'objecte iterador (DirectoryIterator / SplFileInfo)

La majoria d'aquests mètodes són accessibles directament sobre l'objecte ($fitxer) dins d'un bucle foreach quan utilitzes un DirectoryIterator.

Mètodes d'inspecció i tipus

Aquests mètodes ajuden a determinar la naturalesa de l'element (si és un fitxer, un directori, o un element especial).

Mètode Propòsit Valor de Retorn
isDir() Comprova si l'element és un directori. bool
isFile() Comprova si l'element és un fitxer. bool
isDot() Comprova si l'element és un dels directoris especials (. o ..). bool
isLink() Comprova si l'element és un enllaç simbòlic. bool
isReadable() Comprova si l'script té permís de lectura. bool
isWritable() Comprova si l'script té permís d'escriptura. bool

Mètodes d'obtenció de noms i rutes

Aquests mètodes són essencials per construir rutes d'accés o mostrar informació a l'usuari.

Mètode Propòsit Valor de Retorn
getFilename() Retorna el nom complet de l'element (p. ex., imatge.jpg). string
getPathname() Retorna la ruta completa de l'element (p. ex., /var/www/uploads/imatge.jpg). string
getExtension() Retorna l'extensió del fitxer (p. ex., jpg). string
getBasename() Retorna el nom del fitxer sense l'extensió (p. ex., imatge). string
getPath() Retorna el directori pare (la ruta on es troba l'element). string

Mètodes d'obtenció de metadades

Permeten obtenir informació sobre la mida, els permisos, i la data de modificació de l'element, substituint funcions com filesize() o filemtime().

Mètode Propòsit Valor de Retorn
getSize() Retorna la mida del fitxer en bytes. int
getMTime() Retorna la data de l'última modificació (com a timestamp Unix). int
getPerms() Retorna els permisos del fitxer (en format octal). int
getType() Retorna el tipus de node (p. ex., file, dir, link). string

Exemple

Així és com utilitzaries diversos d'aquests mètodes dins d'un bucle per inspeccionar un directori:

PHP
<?php
$iterator = new DirectoryIterator('/var/www/uploads');

echo "<h2>Inspecció del Directori d'Uploads</h2>";

foreach ($iterator as $fitxer) {
    
    // Saltem els directoris especials (IMPORTANT)
    if ($fitxer->isDot()) {
        continue;
    }
    
    echo "Nom: <strong>" . $fitxer->getFilename() . "</strong>";

    if ($fitxer->isFile()) {
        echo " [Fitxer] ";
        echo "Extensió: " . $fitxer->getExtension();
        echo " | Mida: " . number_format($fitxer->getSize() / 1024, 2) . " KB"; 
        
    } elseif ($fitxer->isDir()) {
        echo " [Carpeta] ";
        echo "Ruta Completa: " . $fitxer->getPathname();
    }
    
    echo "<br>";
}
?>

Aquests mètodes permeten un codi més net, més llegible i menys propens a errors que si es fes una concatenació de múltiples funcions procedimentals de PHP per a cada element.

El RecursiveDirectoryIterator és la millor eina de PHP per recórrer un directori i tots els seus subdirectoris de manera automàtica, sense haver de gestionar recursivitat manualment.

Exemple amb RecursiveDirectoryIterator

Aquest codi PHP recorrerà la carpeta /var/www/projecte (simulació) i mostrarà el nom, la mida i la ruta de tots els fitxers que hi trobi, incloent-hi els que es trobin a les subcarpetes (css, js, img, etc.).

PHP
<?php
// Defineix el directori arrel a escanejar
$rootPath = '/var/www/projecte'; // Hauries d'ajustar aquesta ruta al teu entorn

// 1. Crear el RecursiveDirectoryIterator (Defineix l'estructura a recórrer)
$directoryIterator = new RecursiveDirectoryIterator(
    $rootPath, 
    RecursiveDirectoryIterator::SKIP_DOTS // Ignora . i .. automàticament
);

// 2. Crear el RecursiveIteratorIterator (Gestiona la recursivitat del bucle)
$iterator = new RecursiveIteratorIterator(
    $directoryIterator,
    RecursiveIteratorIterator::SELF_FIRST // Permet accedir a la carpeta i després al seu contingut
);

echo "<h2>Exploració Recursiva de Fitxers a: $rootPath</h2>";
echo "<ul style='list-style-type: none; padding-left: 0;'>";

// 3. Recórrer
foreach ($iterator as $fitxer) {
    
    // Per cada element, $fitxer és un objecte SplFileInfo/RecursiveDirectoryIterator
    
    // Mostrem només els fitxers, no els directoris
    if ($fitxer->isFile()) {
        
        $ruta_completa = $fitxer->getPathname();
        $mida_kb = number_format($fitxer->getSize() / 1024, 2);
        
        // Determinem la indentació per visualitzar l'estructura de carpetes
        $nivell = $iterator->getDepth();
        $indentacio = str_repeat('&nbsp;&nbsp;&nbsp;&nbsp;', $nivell); 
        
        echo "<li>";
        echo $indentacio;
        echo "📄 **" . $fitxer->getFilename() . "**";
        echo " | Mida: {$mida_kb} KB";
        echo " | Ruta: <small>{$ruta_completa}</small>";
        echo "</li>";
        
    } elseif ($fitxer->isDir()) {
         $nivell = $iterator->getDepth();
         $indentacio = str_repeat('&nbsp;&nbsp;&nbsp;&nbsp;', $nivell);
         echo "<li>" . $indentacio . " **" . $fitxer->getFilename() . "**</li>";
    }
}

echo "</ul>";

?>

 

Classe Rol Mètodes Útils
RecursiveDirectoryIterator Defineix quina ruta cal escanejar i quines propietats bàsiques ha de tenir cada element (hereta de SplFileInfo). RecursiveDirectoryIterator::SKIP_DOTS (Bandera crucial), isFile(), getSize(), etc.
RecursiveIteratorIterator És el motor del bucle. S'encarrega d'invocar la recursivitat cap als subdirectoris quan l'iterador recursiu troba una carpeta. getDepth() (Retorna el nivell d'anidació actual, essencial per a la visualització).