Atributos de un fichero: Son determinadas características que se asocian y determinan el tipo de fichero y directorio. Están estrictamente definidos por el sistema de archivos de cada sistema operativo. En este documento se muestra como modificarlos.
Un archivo informático o fichero es un conjunto de bits almacenado en un dispositivo periférico (disco duro, USB, etc.). Un archivo se identifica con un nombre (en Windows nombre más extensión, en GNU Linux sólo nombre) y la descripción de la unidad y carpeta o directorio que lo contiene. Los archivos informáticos se llaman así porque son los equivalentes digitales de los archivos en papel del entorno de oficina tradicional [Extraído de wikipedia - Archivo (informática) - ]
Son determinadas características que se asocian y determinan el tipo de fichero y directorio. Están estrictamente definidos por el sistema de archivos de cada sistema operativo
Los posibles atributos son:
Como cosa curiosa, el día 27 de Julio de 2011 el sistema operativo MS DOS, que figura de forma subyacente en todos los sistemas Windows cumple 30 años desde que Microsoft lo comprara a Seattle Computer Products en 1981, aunque la versión 1.0 se lanzara en 1982.
La orden attrib: Permite ver y modificar las propiedades de un archivo.
Copiada directamente de la consola :-)
ATTRIB [+R | -R] [+A | -A ] [+S | -S] [+H | -H] [+I | -I] [unidad:][ruta][nombreDeArchivo] [/S [/D] [/L]] + Establece un atributo. - Borra un atributo. R Atributo de sólo lectura del archivo. A Atributo de archivo de almacenamiento. S Atributo de archivos del sistema. H Atributo de archivo oculto. I No atributo de archivo indizado de contenido. [unidad:][ruta][nombreDeArchivo] Especifica el archivo o archivos que serán afectados por ATTRIB /S Procesa archivos que coinciden en la carpeta y todas las subcarpetas actuales. /D También procesa carpetas. /L Se trabaja en los atributos del vínculo simbólico en vez de en el destino del vínculo simbólico
Hay varias maneras de usarlo:
Desde .NET existe la posibilidad de modificar los atributos de un fichero
Los nombres y valores posibles de los atributos están en una enumeración llamada FileAttributes Enumeration Para usarlos, las clases FileInfo y DirectoryInfo que heredan de la case FileSystemInfo disponen de la propiedad Attributes que Obtiene o establece los atributos del archivo o directorio actual. (Se hereda de FileSystemInfo).
Con este conocimiento podemos realizar una función que compruebe si existe o no un determinado atributo en un objeto FileSystemInfo, de esta forma la misma función vale para tratar archivos y/o para tratas directorios
''' <summary> ''' Comprobar si existe (o no) un atributo determinado ''' en un objeto [IO.FileSystemInfo]. ''' Por ejemplo ¿Existe el atributo [Hidden]? ''' </summary> ''' <param name="fsi"> ''' <para>Tipo <see cref="system.IO.FileSystemInfo">IO.FileSystemInfo</see></para> ''' <para>El objeto que contiene el directorio o el archivo</para> ''' </param> ''' <param name="atributoAComprobar"> ''' <para> Tipo: <see cref="System.IO.FileAttributes">System.IO.FileAttributes</see></para> ''' <para> FileAttributes del FileSystemInfo actual.</para> ''' <para> Atributo que se mira a ver si existe ''' en los atributos del FileSystemInfo actual.</para> ''' </param> ''' <returns> ''' <para>Tipo <see cref="System.Boolean">Boolean</see></para> ''' <para>Un valor lógico que indica </para> ''' <para>[True] En el objeto [FileSystemInfo] Existe el atributo consultado </para> ''' <para>[False] El atributo no existe </para> ''' </returns> ''' <remarks> ''' <para>Para actualizar el valor de los parámetros se llama al método Refresh.</para> ''' </remarks> Public Overloads Shared Function IsMarcado( _ ByVal fsi As System.IO.FileSystemInfo, _ ByVal atributoAComprobar As System.IO.FileAttributes) As Boolean '-------------------------------------- ' Control de parámetros '------------------------------------ If fsi Is Nothing Then Throw New ArgumentNullException( _ "fsi", "El objeto [IO.FileSystemInfo] tiene un valor [Nothing]") End If '----------------------------------- ' Proceso '----------------------------------- fsi.Refresh() Return ((fsi.Attributes And atributoAComprobar) = atributoAComprobar) 'Dim Existe As Boolean = ((fsi.Attributes And atributoAComprobar) = atributoAComprobar) 'Return Existe End Function
No obstante, cuando comprobemos los valores que se devuelven veremos una serie de comportamientos "extraños". Por ejemplo, si el fichero no existe físicamente en el disco, podremos comprobar que TODOS los atributos del fichero están marcados
Tampoco podremos cambiar los atributos de un fichero que no existe físicamente en el disco, porque se dispara una "excepction" del tipo FileNotFoundException o DirectoryNotFoundException según sea el caso
Para Marcar un atributo, por ejemplo queremos que un fichero tenga el atributo [ReadOnly] usaremos la función siguiente
''' <summary> ''' Añadir un atributo de un objeto [IO.FileSystemInfo]. ''' Por ejemplo el atributo [Hidden] ''' </summary> ''' <param name="fsi"> ''' <para>tipo <see cref="System.IO.FileSystemInfo">IO.FileSystemInfo</see></para> ''' <para>El objeto que contiene el directorio o el archivo</para> ''' </param> ''' <param name="atributoAñadir"> ''' <para> Tipo: <see cref="System.IO.FileAttributes">System.IO.FileAttributes</see></para> ''' <para> FileAttributes del FileSystemInfo actual.</para> ''' <para> Atributo que se va a añadir a los atributos del FileSystemInfo actual.</para> ''' </param> ''' <returns> ''' <para>Tipo <see cref="System.Boolean">Boolean</see></para> ''' <para>Un valor lógico que indica </para> ''' <para>[True] La operación se ha realizado correctamente ''' Si la función devuelve el valor true, significa que el ''' objeto [FileSystemInfo] tiene marcado el atributo deseado, ''' (Por ejemplo [Hidden]) , independientemente de si lo tenía ''' previamente o ha sido esta función la que ha realizado el cambio ''' </para> ''' <para>[False] La operación ha fallado </para> ''' </returns> ''' <remarks> ''' <para>Para actualizar el valor de los parámetros se llama al método Refresh.</para> ''' <para>¡¡¡ OJITO !!! ''' Si el objeto FSI, no existe físicamente en el disco, ''' entonces tiene TODOS sus atributos marcados ''' </para> ''' </remarks> Public Overloads Shared Function Marcar( _ ByVal fsi As System.IO.FileSystemInfo, _ ByVal atributoAñadir As System.IO.FileAttributes) As Boolean '---------------------------------------------- 'Apunte Táctico '¡¡¡ OJITO !!! Si el objeto FSI, no existe físicamente en el disco, ' entonces tiene TODOS sus atributos marcados ' Y ADEMAS no permite modificarlos, y si se intenta se dispara ' una excepción del tipo [FileNotFoundException] '---------------------------------------------- '-------------------------------------- ' Control de parámetros 'If fsi Is Nothing Then ' ' se comprueba en la función [IsMarcado] '------------------------------------ Dim atributoMarcado As Boolean Select Case IsMarcado(fsi, atributoAñadir) Case True ' el atributo ya está marcado, devolver true ' la operación de marcar ha tenido éxito atributoMarcado = True Case False ' el atributo NO esta marcado --> marcarlo Try fsi.Attributes = fsi.Attributes Or atributoAñadir ' hay veces que el atributo no se marca de ninguna forma ' tampoco genera error ' miro a ver si se ha marcado y devuelvo el valor correspondiente ' si esta marcado (true) entonces ha funcionado atributoMarcado = IsMarcado(fsi, atributoAñadir) Catch ex As Exception ' hay grupos de atributos que no pueden ir juntos ' por ejemplo , directory y temporal ' directoy y normal atributoMarcado = False End Try End Select Return atributoMarcado End Function
Para quitar un atributo, por ejemplo ya no nos interesa que un archivo tenga el atributo [ReadOnly] porque queremos modificarlo, usaremos la siguiente función:
''' <summary> ''' Borrar un atributo de un objeto [IO.FileSystemInfo]. ''' Por ejemplo quitar el atributo [Hidden] ''' </summary> ''' <param name="fsi"> ''' <para>tipo <see cref="System.IO.FileSystemInfo">IO.FileSystemInfo</see></para> ''' <para>El objeto que contien el directorio o el archivo</para> ''' </param> ''' <param name="atributoABorrar"> ''' <para> Tipo: <see cref="System.IO.FileAttributes">System.IO.FileAttributes</see></para> ''' <para> FileAttributes del FileSystemInfo actual.</para> ''' <para> Atributo que se va a borrar de los atributos del FileSystemInfo actual.</para> ''' </param> ''' <returns> ''' <para>Tipo <see cref="System.Boolean">Boolean</see></para> ''' <para>Un valor logico que indica </para> ''' <para>[True] La operacion se ha realizado correctamente ''' Si la función devuelve el valor true, significa que el ''' objeto [FileSystemInfo] tiene desmarcado el atributo deseado, ''' (Por ejemplo [Hidden]), independientemente de si ya estaba desmarcado ''' previamente o ha sido esta función la que ha realizado el cambio ''' </para> ''' <para>[False] La operacion ha fallado </para> ''' </returns> ''' <remarks> ''' <para>Para poder cambiar un atributo de un objeto [FileSystemInfo], el fichero ''' o carpeta que representa, tiene que existir físicamente en el disco. ''' </para> ''' <para>Si el fichero no existe, el sistema dispara un error ''' [FileNotFoundException] al intentar cambiar un atributo. ''' </para> ''' <para>Si el fichero existe físicamente en el disco, hay atributos que no se ''' pueden cambiar, aunque al intentarlo el sistema no dispara ningún error ''' </para> ''' <para>Esta función intercepta los errores pero no dispara ninguno, ''' simplemente devuelve el valor [False] para indicar que el ''' proceso de desmarcado ha fallado. ''' </para> ''' <para>Es decir, si queremos saber si la operación de desmarcado del atributo ''' ha tenido éxito o no hay que mirar el valor lógico de retorno ''' </para> ''' </remarks> Public Overloads Shared Function Desmarcar( _ ByVal fsi As System.IO.FileSystemInfo, _ ByVal atributoABorrar As System.IO.FileAttributes) As Boolean '-------------------------------------- ' Control de parámetros 'If fsi Is Nothing Then ' ' se comprueba en la función [IsMarcado] '------------------------------------ ' Soy optimista, supongo que esta quitado Dim atributoQuitado As Boolean = True fsi.Refresh() '------------------------------------ ' BUG ' Error FileNotFoundException ' ocurre cuando el fichero no existe físicamente en el disco ' es decir, si el fichero no existe en el disco no puedo modificar sus atributos ' en realidad están todos los atributos marcados ' y el valor fsi.Attributes = -1 '---------------------------------- Select Case IsMarcado(fsi, atributoABorrar) Case True ' el atributo esta marcado --> Quitarlo ' BUG--> Error FileNotFoundException If fsi.Exists = True Then fsi.Attributes = fsi.Attributes Xor atributoABorrar 'hay veces que el atributo no se quita de ninguna forma 'tampoco genera error 'miro a ver si se ha quitado y devuelvo el valor correspondiente ' si esta marcado [True] entonces no he podido quitar el valor, ' la operación de quitado no ha funcionado y ESTA función tiene ' que devolver el valor [False], porque existía el atributo ' marcado y ahora sigue existiendo, luego la operación ha fallado atributoQuitado = Not (IsMarcado(fsi, atributoABorrar)) Else ' el fichero no existe en el disco ' no se pueden modificar los atributos ' el atributo esta marcado ' como ves ni siquiera intento desmarcarlo atributoQuitado = False End If Case False ' el atributo ya esta quitado, devolver true ' la operacion de desmarcar ha tenido exito :-) atributoQuitado = True End Select Return atributoQuitado End Function
Comportamiento de un objeto [File] y de un objeto [Directory] al intentar marcar TODOS sus atributos con las funciones anteriores.
El directorio y el fichero existen físicamente en el disco
'-------------------------------------------------- ' Nota - la diferencia está en la marca [Directory] y [Temporary] '-------------------------------------------------- '(2)(marcados Todos)--- DIRECTORIO-- 'Fichero: E:\Borrar\Nueva carpeta 'Listado de sus atributos: '[X] - ReadOnly '[X] - Hidden '[X] - System '[X] - Directory '[X] - Archive '[ ] - Device '[ ] - Normal '[ ] - Temporary '[ ] - SparseFile '[ ] - ReparsePoint '[ ] - Compressed '[X] - Offline '[X] - NotContentIndexed '[ ] - Encrypted ' '-------------------------------------------------- '(2)(marcados Todos)-- FICHERO-- 'Fichero: E:\Borrar\borrar.soap11 'Listado de sus atributos: '[X] - ReadOnly '[X] - Hidden '[X] - System '[ ] - Directory '[X] - Archive '[ ] - Device '[ ] - Normal '[X] - Temporary '[ ] - SparseFile '[ ] - ReparsePoint '[ ] - Compressed '[X] - Offline '[X] - NotContentIndexed '[ ] - Encrypted '--------------------------------------------
'-------------------------------------------------- ' Comportamiento de los atributos al borrar todos y ' marcar solamente el atributo normal ' la carpeta y el fichero existen fisicamente en el disco '-------------------------------------------------- '(1)(Quitar Todos y Marca Normal)- DIRECTORIO-- 'Fichero: E:\Borrar\Nueva carpeta 'Listado de sus atributos: ' [ ] - ReadOnly ' [ ] - Hidden ' [ ] - System ' [X] - Directory ' [ ] - Archive ' [ ] - Device ' [ ] - Normal ' [ ] - Temporary ' [ ] - SparseFile ' [ ] - ReparsePoint ' [ ] - Compressed ' [ ] - Offline ' [ ] - NotContentIndexed ' [ ] - Encrypted '-------------------------------------------------- '(1)(Quitar Todos y Marca Normal)- FICHERO-- 'Fichero: E:\Borrar\borrar.soap11 'Listado de sus atributos: ' [ ] - ReadOnly ' [ ] - Hidden ' [ ] - System ' [ ] - Directory ' [ ] - Archive ' [ ] - Device ' [X] - Normal ' [ ] - Temporary ' [ ] - SparseFile ' [ ] - ReparsePoint ' [ ] - Compressed ' [ ] - Offline ' [ ] - NotContentIndexed ' [ ] - Encrypted '
'---------------------------------------------- 'Apunte Táctico '¡¡¡ OJITO !!! Si el objeto FSI, no existe físicamente en el disco, ' entonces tiene TODOS sus atributos marcados ' Y ADEMAS no permite modificarlos, y si se intenta se dispara ' una excepción del tipo [FileNotFoundException] '----- ' En este ejemplo, el objeto FileSystemInfo no existe físicamente en el disco ' aunque esta correctamente creado '---------------------------------------------- 'Fichero: E:\Borrar\borrar.noExiste 'Listado de sus atributos: ' [X] - ReadOnly ' [X] - Hidden ' [X] - System ' [X] - Directory ' [X] - Archive ' [X] - Device ' [X] - Normal ' [X] - Temporary ' [X] - SparseFile ' [X] - ReparsePoint ' [X] - Compressed ' [X] - Offline ' [X] - NotContentIndexed ' [X] - Encrypted '----------------------------------------------