HOWTO · Csharp
Elimina tutti i file in una directory in C#
Per eliminare i file direttamente contenuti in una directory, usa `FileInfo.Delete()` su ciascun file restituito da `DirectoryInfo.GetFiles()` o `DirectoryInfo.EnumerateFiles()`. Per eliminare ricorsivamente una directory e tutto il suo contenuto, usa `DirectoryInfo.Delete(true)`: questo rimuove anche la directory su cui viene chiamato.
In questa pagina
Per rimuovere ogni file contenuto direttamente in una directory, enumera i file e chiama FileInfo.Delete() su ciascuno. La directory di destinazione e le sottodirectory restano al loro posto. Se rimuovi anche le sottodirectory, i loro contenuti vengono eliminati ricorsivamente: scegli questa modalità solo se è ciò che desideri. (C#; DirectoryInfo.Delete(true)) (DirectoryInfo.Delete())
Elimina solo i file con DirectoryInfo.GetFiles()
DirectoryInfo.GetFiles() restituisce un array di oggetti FileInfo relativi ai file contenuti direttamente nella directory di destinazione. Chiamando FileInfo.Delete() su ciascuno, elimini quei file senza accedere alle sottodirectory. L’esempio crea una directory temporanea e alcuni file di prova, li elimina e mostra che la directory di destinazione esiste ancora. Infine, rimuove la directory temporanea durante la pulizia.
Esegui questo esempio:
Il codice e le etichette o gli output visibili in questa sezione restano in inglese.
using System;
using System.IO;
class Program
{
static void Main()
{
string path = Path.Combine(Path.GetTempPath(), "csharp-file-cleanup-" + Guid.NewGuid().ToString("N"));
Directory.CreateDirectory(path);
File.WriteAllText(Path.Combine(path, "first.txt"), "one");
File.WriteAllText(Path.Combine(path, "second.txt"), "two");
var directory = new DirectoryInfo(path);
int removed = 0;
foreach (FileInfo file in directory.GetFiles())
{
file.Delete();
removed++;
}
Console.WriteLine($"Files removed: {removed}");
Console.WriteLine($"Target directory remains: {directory.Exists}");
Directory.Delete(path);
}
}
Files removed: 2
Target directory remains: True
Il percorso si trova nella directory temporanea del sistema operativo. Nel codice dell’applicazione, impostalo sulla posizione desiderata e assicurati che il processo abbia i permessi per modificarla. Se un file è bloccato o l’accesso viene negato, l’eliminazione può non riuscire; gestisci l’errore di I/O o di autorizzazione pertinente per la tua applicazione, senza presumere che ogni chiamata vada a buon fine.
Elimina file e sottodirectory con DirectoryInfo.GetDirectories()
Per rimuovere file e sottodirectory, elimina prima i file contenuti direttamente nella directory di destinazione, poi usa DirectoryInfo.GetDirectories() per recuperare le sottodirectory e chiama DirectoryInfo.Delete(true) su ciascuna. L’argomento true rimuove ricorsivamente ogni sottodirectory e il suo contenuto. La directory di destinazione stessa rimane. È una scelta distruttiva: controlla il percorso e accertati che l’eliminazione ricorsiva sia appropriata prima di eseguirla.
Le operazioni sono foreach (FileInfo file in directory.GetFiles()) file.Delete(); seguita da foreach (DirectoryInfo child in directory.GetDirectories()) child.Delete(true);. Mantieni i due cicli in quest’ordine e usa nel programma l’istanza effettiva di DirectoryInfo relativa alla directory di destinazione.
Elimina i file con DirectoryInfo.EnumerateFiles()
DirectoryInfo.EnumerateFiles() fornisce una sequenza enumerabile di oggetti FileInfo, che puoi quindi elaborare direttamente con un ciclo foreach. Invece, GetFiles() restituisce un array. Entrambi gli approcci consentono di eliminare i file contenuti direttamente nella directory di destinazione, senza rimuovere le sottodirectory. Scegli in base alle tue esigenze: un array di risultati oppure l’elaborazione della sequenza. L’enumerazione non garantisce prestazioni migliori per ogni carico di lavoro.
Per eliminare solo i file, il corpo del ciclo resta file.Delete():
Il codice e le etichette o gli output visibili in questa sezione restano in inglese.
using System;
using System.IO;
class Program
{
static void Main()
{
string path = Path.Combine(Path.GetTempPath(), "csharp-enumerate-files-" + Guid.NewGuid().ToString("N"));
Directory.CreateDirectory(path);
File.WriteAllText(Path.Combine(path, "sample.txt"), "content");
var directory = new DirectoryInfo(path);
foreach (FileInfo file in directory.EnumerateFiles())
{
file.Delete();
}
Console.WriteLine($"Files remaining: {directory.GetFiles().Length}");
Directory.Delete(path);
}
}
Files remaining: 0
Elimina le sottodirectory con DirectoryInfo.EnumerateDirectories()
DirectoryInfo.EnumerateDirectories() restituisce le sottodirectory della directory di destinazione. Chiama Delete(true) su ciascuna quando vuoi rimuoverla insieme a tutto il suo albero di contenuti. Questa operazione non elimina i file contenuti direttamente nella directory di destinazione: se devi rimuovere entrambi i tipi di contenuto, aggiungi anche un ciclo per i soli file. La directory di destinazione rimane dopo l’eliminazione delle sottodirectory.
L’operazione sulle sottodirectory è foreach (DirectoryInfo child in directory.EnumerateDirectories()) child.Delete(true);. Non includere questo ciclo in una pulizia dei soli file, a meno che l’eliminazione ricorsiva non sia intenzionale.
Scegli un approccio e verifica il risultato
Usa GetFiles() se ti serve un array oppure EnumerateFiles() se vuoi elaborare i risultati come sequenza enumerabile. Entrambe le operazioni riguardano solo i file. Aggiungi un ciclo sulle sottodirectory con Delete(true) solo quando l’attività richiede un’eliminazione ricorsiva. Verifica il percorso scelto prima dell’eliminazione e controlla poi il contenuto della directory con GetFiles() e GetDirectories(); un percorso mancante o inaccessibile, oppure un file che non può essere rimosso, può impedire il completamento dell’operazione.