.NET Framework Supprimer un fichier


Exemple

Supprimer un fichier (si vous avez les autorisations requises) est aussi simple que:

File.Delete(path);

Cependant, beaucoup de choses peuvent mal tourner:

  • Vous n'avez pas les autorisations requises (une UnauthorizedAccessException est levée).
  • Le fichier peut être utilisé par quelqu'un d'autre ( IOException est lancé).
  • Le fichier ne peut pas être supprimé en raison d'une erreur de bas niveau ou d'un support en lecture seule ( IOException est IOException ).
  • Le fichier n'existe plus ( IOException est IOException ).

Notez que le dernier point (le fichier n'existe pas) est généralement contourné avec un extrait de code comme celui-ci:

if (File.Exists(path))
    File.Delete(path);

Cependant, ce n'est pas une opération atomique et le fichier peut être supprimé par quelqu'un d'autre entre l'appel à File.Exists() et avant File.Delete() . L'approche appropriée pour gérer les opérations d'E / S nécessite la gestion des exceptions (en supposant qu'une autre procédure puisse être prise en cas d'échec de l'opération):

if (File.Exists(path))
{
    try
    {
        File.Delete(path);
    }
    catch (IOException exception)
    {
        if (!File.Exists(path))
            return; // Someone else deleted this file

        // Something went wrong...
    }
    catch (UnauthorizedAccessException exception)
    {
        // I do not have required permissions
    }
}

Notez que ces erreurs d'E / S sont parfois transitoires (fichier en cours d'utilisation, par exemple) et qu'une connexion réseau est impliquée, elle peut alors se rétablir automatiquement sans aucune action de notre part. Il est alors courant de réessayer plusieurs fois une opération d'E / S avec un léger délai entre chaque tentative:

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

    for (int i=1; ; ++i)
    {
        try
        {
            File.Delete(path);
            return;
        }
        catch (IOException e)
        {
            if (!File.Exists(path))
                return;

            if (i == NumberOfAttempts)
                throw;

            Thread.Sleep(DelayBetweenEachAttempt);
        }

        // You may handle UnauthorizedAccessException but this issue
        // will probably won't be fixed in few seconds...
    }
}

private const int NumberOfAttempts = 3;
private const int DelayBetweenEachAttempt = 1000; // ms

Remarque: dans l'environnement Windows, le fichier ne sera pas réellement effacé lorsque vous appelez cette fonction, si quelqu'un d'autre ouvre le fichier en utilisant FileShare.Delete alors le fichier peut être supprimé mais cela ne se produira effectivement que lorsque le propriétaire fermera le fichier.