W3docs

Directory PHP

Directory PHP: guida di riferimento completa per gli sviluppatori PHP.

PHP include un insieme di funzioni per le directory che consentono agli script di ispezionare, creare, leggere e rimuovere cartelle nel filesystem del server — senza ricorrere al sistema operativo. Questa pagina spiega cosa fa ciascuna funzione principale, quando usarla e gli errori comuni da evitare.

Questa è una guida complementare a Gestione dei file PHP e al riferimento più ampio sul Filesystem PHP: i file si trovano all'interno delle directory, quindi i due argomenti vengono quasi sempre usati insieme.

Perché le operazioni sulle directory sono importanti

Quasi ogni applicazione non banale interagisce con il filesystem. Le funzioni per le directory servono per:

  • Organizzare i file caricati — suddividere i caricamenti degli utenti in cartelle per utente o per data (vedi Upload di file PHP).
  • Creare la struttura del progetto al volo — generare cartelle di cache, log o esportazione la prima volta che sono necessarie.
  • Iterare sui contenuti — elencare ogni template, immagine o file di dati in una cartella per elaborarli in blocco.
  • Fare pulizia — eliminare le directory temporanee al termine di un'operazione.

Poiché queste funzioni fanno parte del core PHP, funzionano allo stesso modo su Linux, macOS e Windows (con / accettato come separatore ovunque), il che le rende più portabili rispetto all'esecuzione di mkdir o ls tramite exec().

Funzioni principali per le directory

FunzioneScopo
mkdir($path, $mode, $recursive)Crea una directory. Passa true per $recursive per creare le cartelle padre annidate.
rmdir($path)Rimuove una directory — deve essere vuota prima.
is_dir($path)Restituisce true se il percorso esiste ed è una directory.
scandir($path)Restituisce un array di ogni elemento in una directory (inclusi . e ..).
opendir() / readdir() / closedir()Apre un handle di directory e legge gli elementi uno alla volta.
getcwd()Restituisce la directory di lavoro corrente.
chdir($path)Cambia la directory di lavoro corrente.

scandir() vs. opendir()

Entrambe elencano il contenuto di una directory, ma si adattano a esigenze diverse:

  • scandir() carica tutti gli elementi in un array in una sola volta. È concisa e facile da ordinare, ma utilizza memoria proporzionale al numero di file. Ideale per cartelle piccole o medie.
  • opendir() / readdir() legge gli elementi uno alla volta in streaming. Mantiene la memoria costante anche per directory con decine di migliaia di file. Ideale per cartelle molto grandi.

Entrambe includono le voci speciali . (corrente) e .. (padre) — quasi sempre si vogliono ignorare.

Esempio: creare una directory ed elencarla

Questo script verifica se una directory esiste, la crea (insieme alle eventuali cartelle padre mancanti) se non esiste, poi ne stampa il contenuto:

<?php
$dir = 'uploads/images';

// Create the directory and any missing parents if it doesn't exist
if (!is_dir($dir)) {
    mkdir($dir, 0755, true);
    echo "Directory created: $dir\n";
}

// List directory contents, skipping the . and .. entries
$files = scandir($dir);
echo "Contents of $dir:\n";
foreach ($files as $file) {
    if ($file !== '.' && $file !== '..') {
        echo "- $file\n";
    }
}
?>

Il terzo argomento di mkdir() (true) è il flag ricorsivo: senza di esso, mkdir('uploads/images') fallisce se uploads non esiste già. 0755 è una modalità di permesso ottale (il proprietario può leggere/scrivere/eseguire, gli altri possono leggere/eseguire) e viene ignorata su Windows.

Esempio: streaming con opendir()

Per directory di grandi dimensioni, leggi gli elementi uno alla volta invece di costruire un array completo:

<?php
$dir = __DIR__;

if ($handle = opendir($dir)) {
    while (($entry = readdir($handle)) !== false) {
        if ($entry !== '.' && $entry !== '..') {
            $type = is_dir("$dir/$entry") ? 'dir ' : 'file';
            echo "[$type] $entry\n";
        }
    }
    closedir($handle);
}
?>

Nota il confronto rigoroso !== false: un file chiamato letteralmente "0" è falsy, quindi un while ($entry = readdir(...)) debole si fermerebbe prematuramente. Confronta sempre esplicitamente con false.

Rimozione di directory

rmdir() elimina solo una directory vuota. Per rimuoverne una che contiene ancora file, elimina prima il contenuto — tipicamente con un helper ricorsivo:

<?php
function removeDir(string $dir): void {
    foreach (scandir($dir) as $entry) {
        if ($entry === '.' || $entry === '..') {
            continue;
        }
        $path = "$dir/$entry";
        is_dir($path) ? removeDir($path) : unlink($path);
    }
    rmdir($dir);
}
?>

Questo scorre ogni elemento, ricorrendo nelle sottodirectory e usando unlink() sui file, così la directory è vuota al momento dell'esecuzione di rmdir().

Errori comuni

  • mkdir() senza il flag ricorsivo fallisce se manca qualsiasi cartella padre. Passa true quando crei percorsi annidati.
  • I permessi vengono sottratti da umask — la modalità effettiva è $mode & ~umask(), quindi 0777 può diventare 0755.
  • rmdir() su una cartella non vuota restituisce false ed emette un avviso. Svuotala prima.
  • scandir() include . e .. — filtrali prima di elaborarli.
  • I percorsi relativi dipendono da getcwd(), che è la directory di lavoro dello script, non la posizione del file. Usa __DIR__ per ancorare i percorsi al file corrente.

Flusso di lavoro con le directory in sintesi

graph TD
A[Check Directory] --> B{Exists?}
B -->|No| C[mkdir]
B -->|Yes| D[scandir / opendir]
C --> E[Create Subdirectories]
D --> F[Read Entries]
F --> G[Process Files]
G --> H[close / rmdir]

Le funzioni per directory di PHP offrono un modo portabile e integrato per gestire le cartelle: mkdir() e rmdir() le creano e rimuovono, is_dir() le verifica, e scandir() o opendir()/readdir() ne elencano il contenuto. Usa scandir() per le cartelle piccole per la sua semplicità, e lo streaming con opendir() per quelle grandi per mantenere la memoria costante. Combina queste funzioni con le funzioni per i file PHP e la gestione dei file per costruire funzionalità robuste di upload, cache ed esportazione.

Esercitazione

Pratica
Quale funzionalità fornisce la directory PHP?
Quale funzionalità fornisce la directory PHP?
Was this page helpful?