1. Introduzione
Immagina di scrivere un programma in cui l'utente carica le proprie foto. Sarebbe meglio non conservarle tutte "a caso" in una sola cartella, ma creare directory separate — per data o per nome utente. Oppure, se la tua applicazione genera report: ha senso mettere i risultati in una directory dedicata, che va creata al volo. E cancellare le cartelle temporanee dopo l'uso è proprio responsabilità di un codice ben fatto (e una comodità per l'utente, che non si ritrova con spazzatura).
Lavorare con le directory è un compito standard in molte applicazioni: dal backup ai giochi che vogliono organizzare i save in cartelle. Anche nei colloqui tecnici questo argomento esce spesso, perché non basta sapere che esistono comandi per "creare" o "cancellare": è importante capire il comportamento in situazioni non banali.
Una directory (o cartella) è, in pratica, un contenitore per altri file e directory nel filesystem. Le directory formano una struttura ad albero (filesystem tree): ogni cartella ha un parent, tranne la radice, e può avere molte sottocartelle — anche centinaia o migliaia.
2. Come creare una cartella? Classe statica Directory
Il modo più semplice per creare una cartella è usare il metodo statico Directory.CreateDirectory. Non servono oggetti, basta passare il percorso:
using System.IO;
// Creiamo la cartella "Reports" nella directory corrente
Directory.CreateDirectory("Reports");
Se quella cartella esiste già, il metodo non fa nulla e non lancia eccezioni — puoi chiamare CreateDirectory tranquillamente senza controllare prima l'esistenza.
Proviamo con un percorso più complesso, ad esempio creare una cartella annidata:
Directory.CreateDirectory(@"Data\Photos\2024\June");
Questa chiamata creerà l'intera catena di directory se qualche cartella intermedia non esisteva. Questo si chiama creazione ricorsiva — Directory.CreateDirectory se ne occupa da sola.
Importante! Nei percorsi usa o il doppio backslash (\\) per Windows, o la slash (/). Ancora meglio — usa Path.Combine, di cui abbiamo già parlato.
Cosa ritorna CreateDirectory?
Il metodo ritorna un oggetto di tipo DirectoryInfo. È comodo se vuoi subito lavorare con quella directory:
DirectoryInfo reportsDir = Directory.CreateDirectory("Reports");
Console.WriteLine($"Cartella creata: {reportsDir.FullName}");
Come sapere se una cartella esiste?
Quando devi fare un'operazione su una directory, può essere utile assicurarsi che esista. Per questo c'è il metodo statico:
bool exists = Directory.Exists("Reports");
if (!exists)
{
Console.WriteLine("Cartella non trovata, la creiamo ora!");
Directory.CreateDirectory("Reports");
}
Promemoria: Non è obbligatorio fare un controllo preliminare prima di creare: il metodo non si romperà se la cartella esiste. Però se vuoi mostrare un messaggio carino all'utente o gestire la logica in modo diverso, questo approccio è utile.
3. Creazione di directory: casi pratici
Mettiamo insieme queste conoscenze in una piccola app didattica. Supponiamo di tenere traccia degli utenti e di voler creare per ognuno una cartella separata:
// Aggiungiamo System.IO in cima al file, se non c'è
using System.IO;
Console.Write("Inserisci il nome utente: ");
string userName = Console.ReadLine() ?? "Unknown";
// Costruiamo il percorso per la cartella dell'utente
string basePath = "UsersData";
string userPath = Path.Combine(basePath, userName);
// Creiamo la cartella per l'utente (e la parent se serve)
Directory.CreateDirectory(userPath);
Console.WriteLine($"La cartella per l'utente \"{userName}\" è pronta: {Path.GetFullPath(userPath)}");
L'esempio sopra creerà la struttura di file (se non esisteva):
UsersData/
└── NomeUtente/
Consiglio: usa sempre Path.Combine quando componi pezzi di percorso — così il tuo codice funzionerà sia su Windows che su Linux/Mac.
4. Come cancellare una cartella? Metodo Directory.Delete
Cancellare una cartella è quasi semplice come crearla. Ma ci sono alcune sottigliezze.
Directory.Delete("Reports");
Se la cartella esiste ed è vuota — verrà rimossa senza problemi. Ma se dentro ci sono file o altre cartelle, verrà lanciata un'eccezione:
System.IO.IOException: "The directory is not empty."
E se voglio cancellare la cartella con tutto il suo contenuto?
Esiste un'overload del metodo con il parametro recursive: true:
Directory.Delete("Reports", recursive: true);
ATTENZIONE: La cancellazione ricorsiva elimina tutto in modo irreversibile. Se specifichi la directory sbagliata, puoi perdere dati importanti. Controlla sempre due volte il percorso!
Esempio
Aggiungiamo la possibilità di cancellare la cartella di un utente (per esempio se l'utente ha eliminato il proprio account):
// Chiediamo se cancellare
Console.Write("Cancellare la cartella dell'utente? (y/n): ");
string input = Console.ReadLine() ?? "";
if (input.ToLower() == "y")
{
if (Directory.Exists(userPath))
{
// Cancelliamo insieme a tutto il contenuto
Directory.Delete(userPath, recursive: true);
Console.WriteLine("Cartella dell'utente eliminata!");
}
else
{
Console.WriteLine("La cartella non esiste già.");
}
}
5. Tabella: Metodi principali per lavorare con le cartelle
| Operazione | Metodo | Particolarità |
|---|---|---|
| Creare cartella | |
Crea ricorsivamente tutte le cartelle lungo il percorso |
| Controllare esistenza | |
Ritorna true o false |
| Cancellare cartella vuota | |
Lancia eccezione se la cartella non è vuota |
| Cancellare cartella con contenuto | |
Elimina tutto il contenuto in modo irreversibile |
| Ottenere lista di file | |
Ritorna i nomi dei file |
| Ottenere lista di sottocartelle | |
Ritorna i nomi delle directory |
6. Aspetti non ovvi ed errori tipici
Errore durante la creazione: permessi insufficienti o percorso non valido
Se provi a creare una cartella in directory di sistema (per esempio "C:\Windows\System32\SuperApp"), molto probabilmente otterrai un'eccezione UnauthorizedAccessException o IOException.
Consigli pratici:
Gestisci sempre le eccezioni con try-catch quando lavori con cartelle esterne (per esempio su una chiavetta o su un disco di rete).
Non fidarti ciecamente dei percorsi inseriti dall'utente.
try
{
Directory.CreateDirectory(pathFromUser);
}
catch (Exception ex)
{
Console.WriteLine($"Impossibile creare la cartella: {ex.Message}");
}
Cancellazione fallita perché la cartella è in uso da un altro processo
Se qualcuno (o la stessa tua applicazione) ha aperto un file nella cartella e lo mantiene aperto, al tentativo di cancellare otterrai un IOException — "impossibile eliminare, la cartella è in uso". Prima chiudi tutti i file nella cartella.
La directory non è vuota e hai dimenticato recursive: true
Problema molto comune. Se non passi recursive: true e la cartella non è vuota — otterrai un'eccezione.
Usa percorsi assoluti per operazioni critiche
Lavorare con percorsi relativi ("Reports") è sempre relativo alla working directory corrente dell'applicazione. Se il programma è avviato da un posto diverso, la cartella verrà creata in un posto inatteso. Controlla da dove viene avviato il codice, oppure usa subito percorsi completi:
string fullPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "MyAppData");
Directory.CreateDirectory(fullPath);
GO TO FULL VERSION