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
$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.
$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.
$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
$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
// 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(' ', $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(' ', $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ó). |