Comment vérifier si File.Delete () réussira sans l’essayer, en C #?

En C #, System.IO.File.Delete (filePath) supprime le fichier spécifié ou génère une exception. Si l’utilisateur actuel n’a pas l’autorisation de supprimer le fichier, une exception UnauthorizedAccessException sera générée.

Existe-t-il un moyen de déterminer à l’avance si la suppression est susceptible de déclencher une exception UnauthorizedAccessException ou non (par exemple, interroger la liste de contrôle d’access pour savoir si l’identité du thread en cours est autorisée à supprimer le fichier spécifié?)

Je cherche essentiellement à faire:

if (FileIsDeletableByCurrentUser(filePath)) { /* remove supporting database records, etc. here */ File.Delete(filePath); } 

mais je ne sais pas comment implémenter FileIsDeletableByCurrentUser ().

Le problème avec l’implémentation de FileIsDeletableByCurrentUser est qu’il n’est pas possible de le faire. La raison en est que le système de fichiers est un élément en constante évolution.

Entre chaque vérification effectuée sur le système de fichiers et la prochaine opération, un certain nombre d’événements peuvent se produire et se produiront. Comprenant …

  • Les permissions sur le fichier peuvent changer
  • Le fichier pourrait être supprimé
  • Le fichier peut être verrouillé par un autre utilisateur / processus
  • La clé USB sur laquelle se trouve le fichier pourrait être supprimée

La meilleure fonction que vous puissiez écrire serait très probablement nommée FileWasDeletableByCurrentUser .

Avez-vous essayé System.IO.File.GetAccessControl (nom de fichier), il devrait renvoyer un FileSecurity avec des informations sur les permissions pour ce fichier.

À proprement parler, une exception UnauthorizedAccessException signifie que le chemin est un répertoire. Vous pouvez donc utiliser une commande de type System.IO.Path.GetFileName (chemin) et intercepter l’exception d’argument.

Mais si vous souhaitez une solution plus globale, utilisez System.IO.File.GetAccessControl comme indiqué par Dale Halliwell.

Comme indiqué plus haut. Recherchez les permissions de fichiers et comparez-les avec l’utilisateur qui exécute l’application.

Vous pouvez toujours utiliser cette approche aussi

 bool deletemyfile() { try { ...delete my file return true; } catch { return false; } } 

s’il renvoie false, vous savez qu’il a échoué s’il renvoie true, alors cela a fonctionné et le fichier a disparu. Je ne sais pas ce que vous recherchez, mais c’est le meilleur que je puisse penser.

Bien sûr, vous pouvez vérifier les indicateurs ReadOnly à l’aide de System.IO et probablement de la sécurité ACL sur le fichier, ainsi que de l’utilisateur actuel, mais comme Mehrdad l’a écrit dans son commentaire, il ne serait jamais totalement à l’épreuve. Donc, vous auriez besoin de la gestion des exceptions pour le cas exceptionnel à tout moment (même si c’est juste un accrochage au plus haut niveau , cela enregistre / montre un “problème inattendu” et tue votre application).

Vous devriez obtenir la liste de contrôle d’access (ACL) de ce fichier.

Mais cela ne signifie pas nécessairement que vous pouvez réellement le supprimer car l’indicateur readonly peut toujours être défini ou un autre programme a verrouillé le fichier.

On dirait qu’il serait plus facile de faire les choses dans l’ordre suivant:

  1. Obtenez toutes les informations dont vous avez besoin sur le fichier pour effectuer les autres parties (supprimer les données de la firebase database, etc.)
  2. Essayez de supprimer le fichier
  3. Si vous supprimez le fichier avec succès, effectuez le rest du travail de “nettoyage”. Si vous ne réussissez pas à le supprimer, renvoyez / gérez l’exception, etc.