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.