Retrait attribut lecture seule sur un répertoire à l'aide de C#
J'ai été avec succès en mesure de supprimer attribut lecture seule sur un fichier à l'aide de l'extrait de code suivant:
En main.cs
FileSystemInfo[] sqlParentFileSystemInfo = dirInfo.GetFileSystemInfos();
foreach (var childFolderOrFile in sqlParentFileSystemInfo)
{
RemoveReadOnlyFlag(childFolderOrFile);
}
private static void RemoveReadOnlyFlag(FileSystemInfo fileSystemInfo)
{
fileSystemInfo.Attributes = FileAttributes.Normal;
var di = fileSystemInfo as DirectoryInfo;
if (di != null)
{
foreach (var dirInfo in di.GetFileSystemInfos())
RemoveReadOnlyFlag(dirInfo);
}
}
Malheureusement, cela ne fonctionne pas sur les dossiers. Après l'exécution du code, lorsque je vais dans le dossier, clic droit et faire propriétés, voici ce que je vois:
La lecture seule drapeau est encore vérifié mais il l'a supprimé à partir de fichiers d'en-dessous. Ce sont les causes d'un échec du processus de la suppression de ce dossier. Quand j'ai supprimer manuellement le drapeau et relancez le processus (un fichier bat), il est capable de supprimer le fichier (donc je sais que ce n'est pas un problème avec le fichier bat)
Comment puis-je supprimer ce drapeau en C#?
OriginalL'auteur DotnetDude | 2010-10-05
Vous devez vous connecter pour publier un commentaire.
Vous pouvez aussi faire quelque chose comme ce qui suit de façon récursive clair readonly (et d'archivage, etc.) pour tous les répertoires et les fichiers dans un certain répertoire parent:
Vous pouvez donc appeler cela de la sorte:
OriginalL'auteur Mark Avenius
Essayer DirectoryInfo au lieu de FileInfo
Pour nettoyer attrbutes sur les fichiers-
OriginalL'auteur Vinay B R
La boîte de dialogue fonctionne d'une manière très bizarre. Il montre toujours la façon dont vous le voyez dans votre capture d'écran, quel que soit l'état de l'attribut lecture seule. La case à cocher est dans le "indéterminé". Vous devez cliquer dessus et de clair ou de l'archiver pour faire exécuter son action. Et malgré le texte de l'invite (mais pas l'indicateur à côté de la case), il modifie uniquement l'attribut lecture seule sur les fichiers dans le répertoire, et non pas le répertoire lui-même.
Utilisez la commande attrib de ligne de commande pour voir ce qui se passe vraiment. Selon toute probabilité, votre code ne fonctionne pas, car le répertoire contient des fichiers qui ont leur attribut ReadOnly. Vous aurez à les réitérer.
OriginalL'auteur Hans Passant
L'indicateur de lecture seule sur les répertoires de Windows est en fait un abus de langage. Le dossier ne pas utiliser l'indicateur de lecture seule. La question va être à la personnalisation. Le drapeau est utilisé par Windows pour identifier qui sont les personnalisations sur le dossier.
C'est un vieux post, avec une question qui tire à sa fin, mais, pensé les gens pourraient encore fonctionner dans l'il, comme il est assez ennuyeux lorsque vous le frappez.
Microsoft Explication
OriginalL'auteur Roy Folkker
Définir la
Attributes
bien sur l'originaldirInfo
:OriginalL'auteur Mark Cidade
Juste au cas où tout se passe à travers cela plus tard...
TOUTES les autres réponses postées avant le mien sont erronées ou de l'utilisation inutile de la récursivité.
Tout d'abord la "Lecture Seule" case à cocher dans la boîte de dialogue de propriétés de windows a toujours le tri-state marqueur pour les dossiers. C'est parce que le dossier lui-même n'est pas en lecture seule, mais les fichiers à l'intérieur peut-être.
Si vous souhaitez définir/annuler lecture seule drapeau pour TOUS les fichiers. vous pouvez le faire simplement comme suit:
Pas ce qui était demandé. Et vous avez encore une idée étrange qu'un "Répertoire" est un attribut lecture seule... il ne fait pas. Avez-vous essayez de tout le code? OPs code fonctionne mais seulement parce que vous pouvez lancer DirectoryInfo FileInfo. Ce qu'il fait vraiment est juste définit l'attribut sur tous les fichiers, tester vous-même. Un répertoire ne peut pas être réglé à FileAttibutes.Normal ou .ReadOnly il est toujours .Répertoire. Comme je l'ai dit l'explorateur affiche TOUJOURS un état intermédiaire pour les répertoires. Aussi un fichier BAT pouvez supprimer "Lecture Seule" répertoire de toute façon, de sorte qu'il est plus probable que quelque chose d'autre de verrouillage sur son PC.
OriginalL'auteur Dave Williams
IEnumerable /Lambda solution de manière récursive retrait attribut lecture seule à partir de répertoires et de fichiers:
OriginalL'auteur Stuart Gillibrand
Je vois que @DotnetDude dit dans les commentaires que les solutions de gars ne travaillent pas. À mes yeux, c'est se produit parce que les gars ne sont pas mentionnés qui ont besoin d'utiliser Fichier.SetAttributes méthode pour appliquer de nouveaux attributs.
OriginalL'auteur RredCat
Cela peut ou peut ne pas être directement liés, mais la racine du problème dans votre cas peut être causé par les fichiers sous-jacents. Par exemple, je suis tombé sur cette question en essayant de supprimer un répertoire:
Il en résulte que "l'Accès au chemin d'accès 'blah' est refusé". Pour résoudre ce problème, j'ai supprimé l'attribut en lecture seule sur les sous-fichiers et a ensuite été en mesure de supprimer le répertoire parent. Dans mon cas, j'ai été en utilisant powershell, vous pouvez utiliser le .NET équivalent.
OriginalL'auteur Brandon Hawbaker
ce code fonctionne pour moi.. pour partager un dossier pour chacun à lire et à écrire l'autorisation
n'est pas une classe, c'est un VB.NET fonction. En C#, vous pouvez utiliser le Processus.Start() pour un comportement similaire (à savoir, le démarrage d'un autre processus.) Rechercher de la documentation pour la
Process
etProcessStartInfo
des classes pour plus d'informations. Dans le but de simplement éteindre la propriété en Lecture Seule, comme c'était la question initiale, si, je vous recommande d'utiliser la Marque Avenius de réponse, plutôt que de commencer un nouveau processus.OriginalL'auteur redz