Comment supprimer un fichier après avoir vérifié s'il existe


220

Comment puis-je supprimer un fichier en C # par exemple C:\test.txt, bien que j'applique le même type de méthode que dans les fichiers batch, par exemple

if exist "C:\test.txt"

delete "C:\test.txt"

else 

return nothing (ignore)

Réponses:


388

C'est assez simple en utilisant la classe File .

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


Comme Chris l'a souligné dans les commentaires, vous n'avez pas réellement besoin de faire la File.Existsvérification car File.Deletene lève pas d'exception si le fichier n'existe pas, bien que si vous utilisez des chemins absolus, vous aurez besoin de la vérification pour vous assurer que le le chemin de fichier entier est valide.


13
Ce test n'est pas vraiment nécessaire. Voir mon post.
Chris Eberle

20
Le test est nécessaire si vous souhaitez empêcher une éventuelle exception DirectoryNotFoundException.
Timothy Strimple

7
Le test ne doit pas être utilisé à la place d'une gestion d'exception, mais plutôt en conduction avec lui. Un certain nombre de scénarios peuvent entraîner le retour de la vérification existante et la suppression de la suppression.
Josh

1
Pourquoi y a-t-il un @avant le chemin du fichier? Pour moi ça marche sans.
Pascal Ackermann

5
@ vous évite d'avoir à doubler les barres obliques inverses.
PRMan

105

Utilisez System.IO.File.Delete comme ceci:

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

De la documentation:

Si le fichier à supprimer n'existe pas, aucune exception n'est levée.


7
Cela lèvera une exception DirectoryNotFoundException si "le chemin spécifié n'est pas valide (par exemple, il se trouve sur un lecteur non mappé)."
Timothy Strimple

5
Tellement bizzare. Dit Intellisense An exception is thrown if the specified file does not exist.
fearofawhackplanet

Vous utilisez peut-être une version différente du framework .NET?
Chris Eberle

1
J'utilise .Net4, il semble que l'intellisense soit faux J'ai effectué un contrôle et aucune exception n'est levée
fearofawhackplanet

3
Ouais j'ai essayé et c'est juste System.IO.File.Delete(@"C:\test.txt");assez. Merci
Berkay Turancı

34

Vous pouvez importer l' System.IOespace de noms en utilisant:

using System.IO;

Si le chemin d'accès au fichier représente le chemin d'accès complet au fichier, vous pouvez vérifier son existence et le supprimer comme suit:

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

2
Pourquoi ne pas simplement lancer l'appel Supprimer et intercepter toute exception indiquant que le fichier n'existait pas?
colère

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

mais

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

fera de même tant que le dossier existe.


23

Si vous voulez éviter cela, DirectoryNotFoundExceptionvous devrez vous assurer que le répertoire du fichier existe bien. File.Existsaccomplit cela. Une autre façon serait d'utiliser les classes utilitaires Pathet Directorycomme ceci:

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;
        }
    }


1

Si vous lisez à partir de ce fichier à l'aide de FileStream et que vous souhaitez ensuite le supprimer, assurez-vous de fermer le FileStream avant d'appeler le File.Delete (chemin). J'ai eu ce problème.

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");

Ou utilisez une usingdéclaration, où le File.Delete()serait en dehors des crochets. Dans l'exemple que vous avez, vous devez également faire un filestream.Dispose();.
vapcguy

1

Parfois, vous souhaitez supprimer un fichier quel que soit le cas (quelle que soit l'exception, veuillez supprimer le fichier). Pour de telles situations.

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);
            }
        }

Remarque: Une exception n'est pas levée si le fichier spécifié n'existe pas.


10
Vous essayez donc de supprimer le fichier 20 fois par seconde jusqu'à ce qu'il soit supprimé. Que faire si, pour une raison quelconque, le fichier ne peut pas être supprimé et que le programme essaiera de le supprimer pour toujours? Je ne pense pas que ce soit une bonne solution.
kv1dr

2
À tout le moins, vous devez fournir un paramètre de délai d'expiration.
colère

@ kv1dr à droite. Je pense que vous devriez essayer pendant un temps limité et renvoyer un message d'échec si le fichier n'a pas été supprimé.
QMaster

0

Ce sera le moyen le plus simple,

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

Thread.sleep aidera à fonctionner parfaitement, sinon, cela affectera l'étape suivante si nous copions ou écrivons le fichier.

Une autre façon que j'ai fait est,

if (System.IO.File.Exists(filePath))
{
System.GC.Collect();
System.GC.WaitForPendingFinalizers();
System.IO.File.Delete(filePath);
}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.