Comment puis-je vérifier si un Fichier.Supprimer() va réussir sans l'essayer, en C#?
En C#, Système.IO.Fichier.Supprimer(filePath) supprimer le fichier spécifié, ou lever une exception. Si l'utilisateur courant n'a pas l'autorisation de supprimer le fichier, il faudra lever un UnauthorizedAccessException.
Est-il un moyen que je peux dire à l'avance si la suppression est susceptible de lever une UnauthorizedAccessException ou pas (c'est à dire de la requête de l'ACL pour voir si l'identité du thread actuel a la permission de supprimer le fichier spécifié?)
Au fond, je cherche à faire:
if (FileIsDeletableByCurrentUser(filePath)) {
/* remove supporting database records, etc. here */
File.Delete(filePath);
}
mais je n'ai aucune idée de comment mettre en œuvre FileIsDeletableByCurrentUser().
- Il est assez difficile de gérer des conditions de course. Que faire si le fichier "a" supprimables au moment de l'évaluation
FileIsDeletableByCurrentUser
mais tout de suite après, un autre processus verrouille le fichier? - Vous ne pouvez pas supprimer le fichier si il est ouvert par un autre processus (comme, disons, IIS ou bureau). Ça peut être la même exception, mais vous ne pourriez pas le dire tout simplement en regardant les autorisations
- Êtes-vous sûr que l'utilisation d'un try/catch pour les exceptions spécifiques n'est pas la bonne façon de gérer cela? Il semble que vous essayez de ré-inventer la roue ici.
- exemple de code avec la solution finale?
- Ce Microsoft doc lien doit être utile si vous voulez écrire le code de vérification des autorisations par vous même: docs.microsoft.com/en-us/dotnet/api/...
InformationsquelleAutor Dylan Beattie | 2009-09-18
Vous devez vous connecter pour publier un commentaire.
Prendre un coup d'oeil à cet article - http://www.codeproject.com/KB/files/UserFileAccessRights.aspx
Le problème avec la mise en œuvre de
FileIsDeletableByCurrentUser
est qu'il n'est pas possible de le faire. La raison en est le système de fichiers est une constante modification de l'élément.Entre dans aucune case à vous rendre sur le système de fichiers et la prochaine opération de n'importe quel nombre d'événements qui peuvent et vont se produire. Y compris ...
La meilleure fonction que vous pourriez écrire serait plus juste d'être nommé
FileWasDeletableByCurrentUser
.Avez-vous essayé Système.IO.Fichier.GetAccessControl(nom de fichier) il doit retourner un FileSecurity avec des informations sur les permissions de ce fichier.
À proprement parler, une UnauthorizedAccessException signifie que le chemin d'accès est un répertoire, vous pouvez utiliser un Système.IO.Chemin d'accès.GetFileName(chemin) type de commande et d'attraper l'exception d'argument.
Mais si vous voulez une approche plus globale de la solution, l'utilisation du Système.IO.Fichier.GetAccessControl comme mentionné par Dale Halliwell
Comme indiqué ci-dessus.
Recherche les autorisations de fichier et de les comparer avec l'utilisateur qui exécute l'application.
Vous pouvez toujours utiliser cette approche ainsi
si elle retourne false, vous savez qu'elle a échoué si elle retourne true, alors.. il a travaillé et fichier est allé. Pas sûr de ce que vous recherchez exactement, mais c'était le mieux que je pouvais penser de
Bien sûr, vous pouvez vérifier ReadOnly drapeaux en utilisant le Système.IO et probablement de sécurité ACL sur le fichier combiné avec l'utilisateur en cours aussi, mais comme Mehrdad écrit dans son commentaire, il ne serait jamais en pleine preuve dans tous les cas. De sorte que vous devez la gestion des exceptions pour les cas exceptionnels à tous les temps (même si sa juste un haut niveau de fourre-tout, que les journaux/montre un "problème inattendu" et tue votre demande).
Vous devriez obtenir la liste de contrôle d'accès (ACL) de ce fichier.
Mais cela ne signifie pas que l'on pouvait le supprimer parce que la lecture seule drapeau pourrait encore être défini ou d'un autre programme a verrouillé le fichier.
Semble qu'il serait plus facile de faire les choses dans l'ordre de: