visual studio microsoft español descargar community c# file attributes explorer file-attributes

studio - ¿Cómo establecer el atributo claro "X" en los archivos con C#?



visual studio installer (5)

La X es más probable que los permisos de ejecución. icalcs menciona y posiblemente pueda usar este comando desde C # para establecer un atributo de archivo, aunque no estoy seguro si funcionará contra un sistema de archivos FAT o no.

Tengo un archivo oculto en mi almacenamiento extraíble USB (sistema de archivos FAT).

Estoy usando Windows 7. Si voy a la ventana Propiedades de este archivo y luego a la pestaña Detalles, veré que los atributos del archivo son HX . Cuando ejecuto cmd y uso attrib , me dijeron que el archivo tiene el atributo H. Nada sobre X. He intentado con la help attrib , pero todavía no hay nada sobre el atributo X.

Yo sé eso:

  • H = oculto
  • S = Sistema
  • A = Archivo
  • R = Readonly

Sin embargo, no tengo idea de qué significa X. También encontré para qué sirven los atributos N y E.

Wikipedia no menciona el atributo X.

Google encontró dos temas que mencionan el atributo X:

Ninguno de estos ayudó.

Me gustaría poder leer / escribir esta bandera en C #, pero hasta ahora he leído la documentación de la enumeración FileAttributes y FileAttributes experimentado con la configuración de algunos de los atributos listados (usando los métodos File.GetAttributes & File.SetAttributes ) en el archivo.

Ninguno de estos experimentos dio como resultado que el atributo X aparezca en Propiedades -> Detalles. Por lo tanto, no tengo idea de cómo abordarlo, especialmente porque todavía no sé qué significa el atributo X.

Entonces, ¿qué es el atributo X y cómo se puede establecer / borrar en el archivo seleccionado en C #?


Tal vez estoy equivocado, pero ... creo que el atributo X significa que el archivo tiene atributos extendidos . Lamentablemente, los atributos extendidos no se pueden modificar con C #.


No puedo reproducir su problema, pero como solución para eliminar ese atributo creo que puede probar con robocopy :

robocopy xattributefile copyoffile /copy:DT

/copy:DT : especifica las propiedades del archivo que se copiarán.

Esto no debería copiar el atributo, pero no sé si funciona con el atributo X)


File Attribute X corresponde a System.IO.FileAttributes.Device que tiene un valor entero de 64 (0x40) usando .NET no se puede establecer directamente este valor. El problema es que cuando llamas a File.SetAttributes(path, fileAttributes) llama a una función interna de importación dll en Mscorlib.dll , es decir, el método estático Microsoft.Win32.Win32Native.SetFileAttributes , esta es una importación dll directa de kernel32.dll y Se define como:

// Microsoft.Win32.Win32Native [DllImport("kernel32.dll", BestFitMapping = false, CharSet = CharSet.Auto, SetLastError = true)] internal static extern bool SetFileAttributes(string name, int attr);

En pocas palabras, incluso con kernel32.dll no puede establecer este valor. Ver: SetFileAttributes y System.IO.FileAttributes .

Pero puede escribir código que efectivamente hará lo mismo que establecer o eliminar este atributo.

Su mejor y probablemente única (razonable) respuesta sería mantener un archivo de plantilla con el permiso X , cuando necesite establecer un archivo para que X cambie el nombre del archivo existente, copie el archivo X plantilla y luego escriba los otros atributos.

Para eliminar el permiso X , debe leer el archivo y escribir en un nuevo archivo y luego copiar los permisos usando una simple llamada a File.SetAttributes(path, File.GetAttributes(oldPath)); (que no establecerá el permiso X

Este enfoque es bastante directo y sería completamente posible en .NET nativo (y tampoco se vería demasiado desagradable, en comparación con el pirateo en el nivel del disco o la invocación de cgywin, si eso funcionara).


Desafortunadamente, la API de Windows le impedirá configurar / desactivar FILE_ATTRIBUTE_DEVICE porque no está destinado a ser configurado en archivos. Si realmente necesita la capacidad de hacerlo, tendrá que acceder al disco directamente. Realmente no recomiendo tratar de hacer eso en C #.

La implementación más rápida posible sería olvidarse de hacerlo en Windows, descargar la fuente de mtools y hacer un par de ediciones en la fuente de mattrib para que funcione.

por ejemplo, agregar a msdos.h:

#define ATTR_DEVICE 0x40 #define IS_DEVICE(entry) (HAS_BIT((entry),ATTR_DEVICE))

A continuación, agregue el código a mattr.c para que pueda establecer el atributo y verificar el cambio:

static int view_attrib(direntry_t *entry, MainParam_t *mp) { ... /* Add this if block */ if(IS_DEVICE(entry)) putchar(''X''); ... } static int concise_view_attrib(direntry_t *entry, MainParam_t *mp) { ... /* Add the following if block */ if(IS_DEVICE(entry)) putchar(''X''); ... } static int letterToCode(int letter) { switch (toupper(letter)) { ... /* Add the following case */ case ''X'': return ATTR_DEVICE; ... } }

Entonces solo tendrías que configurar tu disco en mtools y llamar al recién creado comando mattrib -x en el archivo que deseas cambiar.