Come eliminare un file dopo aver verificato se esiste


220

Come posso eliminare un file in C # ad es. C:\test.txt, Sebbene applichi lo stesso tipo di metodo come nei file batch ad es

if exist "C:\test.txt"

delete "C:\test.txt"

else 

return nothing (ignore)

Risposte:


388

Questo è abbastanza semplice usando la classe File .

if(File.Exists(@"C:\test.txt"))
{
    File.Delete(@"C:\test.txt");
}


Come ha sottolineato Chris nei commenti, in realtà non è necessario eseguire il File.Existscontrollo poiché File.Deletenon genera un'eccezione se il file non esiste, sebbene se si utilizzano percorsi assoluti sarà necessario il controllo per assicurarsi che il l'intero percorso del file è valido.


13
Quel test non è effettivamente necessario. Vedi il mio post.
Chris Eberle,

20
Il test è necessario se si desidera impedire una possibile DirectoryNotFoundException.
Timothy Strimple,

7
Il test non dovrebbe essere usato al posto della gestione delle eccezioni, ma piuttosto in conduzione con esso. Qualsiasi numero di scenari può comportare che il controllo esistente ritorni vero e Elimina lancio.
Josh,

1
Perché c'è un @prima del percorso del file? Per me funziona senza.
Pascal Ackermann,

5
@ ti impedisce di raddoppiare le barre rovesciate.
PRMan,

105

Usa System.IO.File.Delete in questo modo:

System.IO.File.Delete(@"C:\test.txt")

Dalla documentazione:

Se il file da eliminare non esiste, non viene generata alcuna eccezione.


7
Ciò genererà una DirectoryNotFoundException se "Il percorso specificato non è valido (ad esempio, si trova su un'unità non mappata)."
Timothy Strimple,

5
Che strano. Intellisense dice An exception is thrown if the specified file does not exist.
fearofawhackplanet,

Forse stai usando una versione diversa di .NET framework?
Chris Eberle,

1
Sto usando .Net4, sembra che l'intellisense sia sbagliato, ho eseguito un controllo e nessuna eccezione è stata lanciata
fearofawhackplanet

3
Sì, ci ho provato ed System.IO.File.Delete(@"C:\test.txt");è abbastanza. Grazie
Berkay Turancı il

34

È possibile importare lo System.IOspazio dei nomi usando:

using System.IO;

Se il percorso del file rappresenta il percorso completo del file, è possibile verificarne l'esistenza ed eliminarlo come segue:

if(File.Exists(filepath))
{
     try
    {
         File.Delete(filepath);
    } 
    catch(Exception ex)
    {
      //Do something
    } 
}  

2
Perché non solo emettere la chiamata Elimina indipendentemente e catturare qualsiasi eccezione che indica che il file non esisteva?
antred

32
if (System.IO.File.Exists(@"C:\test.txt"))
    System.IO.File.Delete(@"C:\test.txt"));

ma

System.IO.File.Delete(@"C:\test.txt");

farà lo stesso finché esiste la cartella.


23

Se vuoi evitare un DirectoryNotFoundException, dovrai assicurarti che la directory del file esista davvero. File.Existscompie questo. Un altro modo sarebbe quello di utilizzare le classi utility Pathe in questo Directorymodo:

string file = @"C:\subfolder\test.txt";
if (Directory.Exists(Path.GetDirectoryName(file)))
{
    File.Delete(file);
}

15
  if (System.IO.File.Exists(@"C:\Users\Public\DeleteTest\test.txt"))
    {
        // Use a try block to catch IOExceptions, to 
        // handle the case of the file already being 
        // opened by another process. 
        try
        {
            System.IO.File.Delete(@"C:\Users\Public\DeleteTest\test.txt");
        }
        catch (System.IO.IOException e)
        {
            Console.WriteLine(e.Message);
            return;
        }
    }

11
if (File.Exists(path))
{
    File.Delete(path);
}

1

Se stai leggendo da quel file usando FileStream e vuoi eliminarlo, assicurati di chiudere FileStream prima di chiamare File.Delete (percorso). Ho avuto questo problema.

var filestream = new System.IO.FileStream(@"C:\Test\PutInv.txt", System.IO.FileMode.Open, System.IO.FileAccess.Read, System.IO.FileShare.ReadWrite);
filestream.Close();
File.Delete(@"C:\Test\PutInv.txt");

Oppure usa usingun'istruzione, dove File.Delete()andrebbero fuori dalle parentesi. Nell'esempio che hai, dovresti anche fare un filestream.Dispose();.
vapcguy,

1

A volte vuoi eliminare un file in ogni caso (qualunque sia l'eccezione, per favore cancella il file). Per tali situazioni.

public static void DeleteFile(string path)
        {
            if (!File.Exists(path))
            {
                return;
            }

            bool isDeleted = false;
            while (!isDeleted)
            {
                try
                {
                    File.Delete(path);
                    isDeleted = true;
                }
                catch (Exception e)
                {
                }
                Thread.Sleep(50);
            }
        }

Nota: non viene generata un'eccezione se il file specificato non esiste.


10
Quindi stai cercando di eliminare il file 20 volte al secondo fino a quando non viene eliminato. Che cosa succede se, per qualche motivo, il file non può essere eliminato e il programma tenterà di eliminarlo per sempre? Non credo sia una buona soluzione.
kv1dr,

2
Come minimo, è necessario fornire un parametro di timeout.
antred

@ kv1dr giusto. Penso che dovresti provare per un tempo limitato e restituire un messaggio di errore se il file non è stato eliminato.
QMaster il

0

Questo sarà il modo più semplice,

if (System.IO.File.Exists(filePath)) 
{
  System.IO.File.Delete(filePath);
  System.Threading.Thread.Sleep(20);
}

Thread.sleep aiuterà a funzionare perfettamente, altrimenti influenzerà il passaggio successivo se eseguiamo la copia o la scrittura del file.

Un altro modo in cui ho fatto è

if (System.IO.File.Exists(filePath))
{
System.GC.Collect();
System.GC.WaitForPendingFinalizers();
System.IO.File.Delete(filePath);
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.