2010-02-23 14 views
32

¿Cómo puedo eliminar programáticamente el atributo readonly de un directorio en C#?Eliminar el atributo readonly del directorio

+0

@Lalit ¿Qué estás tratando de lograr? –

+0

ver He leído solo la carpeta en mi camino. Quiero copiar algunos archivos en esa carpeta. de modo que desea convertirlo temporalmente en escritura, elimine solo de forma legible, luego copie los archivos y, a continuación, cree que ese archivo sea de solo lectura. ¿Puedes ayudarme a plaese? Este es un requisito –

+0

En Windows, tener el atributo readonly establecido en un directorio no tiene sentido. Aún puede eliminar, cambiar el nombre, etc. ese directorio. Consulte https://support.microsoft.com/en-us/help/326549/you-cannot-view-or-change-the-read-only-or-the-system-attributes-of-folders-in-windows -server-2003, -in-windows-xp, -in-windows-vista-or-in-windows-7 para más información. –

Respuesta

73
var di = new DirectoryInfo("SomeFolder"); 
di.Attributes &= ~FileAttributes.ReadOnly; 
+3

hey darin, ¿qué significa esta sintaxis? "& = ~" ¡Salud! – andy

+27

& = -> Agregar no toque todos los demás atributos y ~ -> complemento, haga lo contrario de readonly – MarkKGreenway

5

Aquí es un buen enlace a ejemplos de archivo de modificación de atributos utilizando C#

http://www.csharp-examples.net/file-attributes/

basado en su ejemplo, se puede quitar el atributo de sólo lectura como esto (no he probado esto):

File.SetAttributes(filePath, File.GetAttributes(filePath) & ~FileAttributes.ReadOnly); 
+4

vamos en esto todo sobre Archivo. wana abt Directorio ... por favor. –

+1

@Red Swan: Acabo de probar esto para agregar atributos ocultos, y también funciona bien con los directorios. – Petrucio

+1

Esto funciona para archivos y directorios porque un directorio es como un archivo especial con el conjunto de atributos de directorio (FileAttributes.Directory). – seveves

2

Si está intentando eliminar el atributo de un archivo en el sistema de archivos, cree una instancia de la clase System.IO.FileInfo y establezca la propiedad IsReadOnly en false.

 FileInfo file = new FileInfo("c:\\microsoft.text"); 
     file.IsReadOnly = false; 
+0

no no sobre el archivo. Quiero de Directorio/Carpeta –

0

Conseguí finalmente. ;)

class Program 
{ 
    static void Main(string[] args) 
    { 
     DirectoryInfo di = new DirectoryInfo("c:\\test"); 

     FileAttributes f = di.Attributes; 

     Console.WriteLine("Directory c:\\test has attributes:"); 
     DecipherAttributes(f); 

    } 

    public static void DecipherAttributes(FileAttributes f) 
    { 
     // To set use File.SetAttributes 

     File.SetAttributes(@"C:\test", FileAttributes.ReadOnly); 

     if ((f & FileAttributes.ReadOnly) == FileAttributes.ReadOnly) 
      Console.WriteLine("ReadOnly"); 

     // To remove readonly use "-=" 
     f -= FileAttributes.ReadOnly; 

     if ((f & FileAttributes.ReadOnly) == FileAttributes.ReadOnly) 
      Console.WriteLine("ReadOnly"); 
     else 
      Console.WriteLine("Not ReadOnly"); 
    } 
} 
3

Usando el operador - = asignación es peligrosa por dos razones: 1) sólo funciona si se establece el atributo de sólo lectura, por lo tanto se requiere una prueba de antemano. 2) Está realizando una operación de resta, que no es la mejor opción cuando se trabaja con indicadores binarios. La operación de resta funciona si la condición 1 (arriba) es verdadera, ¡pero operaciones de resta adicionales ALTERARÁN OTROS BITS en el campo FileAttributes!

Use "& = ~ FileAttributes.ReadOnly;" para restablecer el indicador ReadOnly.

Use "| = FileAttributes.ReadOnly;" para establecer el indicador ReadOnly.

0

el establecimiento de atributos a FileAttributes.Normal trabajaron para mí en ambos carpetas y archivos.

+0

La única preocupación que tengo con este enfoque es ¿qué pasa si la carpeta (o archivo) tiene otro atributo? Si una carpeta está oculta y es de solo lectura, y solo desea que ya no sea solo de lectura, su método ya no la ocultará. Eso podría tener consecuencias no deseadas. –

0
public static void DeleteDirectory(string path) 
    { 
     var directory = new DirectoryInfo(path) 
     { Attributes =FileAttributes.Normal }; 
     foreach (var info in directory.GetFileSystemInfos("*", SearchOption.AllDirectories)) 
     { 
      info.Attributes = FileAttributes.Normal; 
     } 
     directory.Delete(true); 
    } 
Cuestiones relacionadas