Flujos de archivos (sistemas de archivos locales)

Un flujo es una secuencia de bytes. En el sistema de archivos NTFS, los flujos contienen los datos que se escriben en un archivo y que proporcionan más información sobre un archivo que los atributos y propiedades. Por ejemplo, puede crear un flujo que contenga palabras clave de búsqueda o la identidad de la cuenta de usuario que crea un archivo.

Cada flujo asociado a un archivo tiene su propio tamaño de asignación, tamaño real y longitud de datos válida:

  • El tamaño de asignación es la cantidad de espacio en disco que está reservado para un flujo.
  • El tamaño real es el número de bytes que usa un autor de llamada.
  • La longitud de datos válida (VDL) es el número de bytes que se inicializan a partir del tamaño de asignación del flujo.

Cada flujo también mantiene su propio estado para la compresión, el cifrado y la dispersión. El atributo FILE_ATTRIBUTE_SPARSE_FILE del archivo se establece en el miembro dwFileAttributes de la estructura WIN32_FIND_DATA devuelta desde las funciones FindFirstFile, FindFirstFileEx y FindNextFile si alguno de los flujos se ha dispersado. GetFileAttributes, GetFileAttributesEx, GetFileAttributesTransact, GetFileInformationByHandle y GetFileInformationByHandleEx devuelven el estado disperso del flujo de datos predeterminado si no se especifica ningún flujo.

No hay tiempos de archivo asociados a un flujo. Los tiempos de archivo de un archivo se actualizan cuando se actualiza cualquier flujo de un archivo.

Los bloqueos oportunistas se mantienen por flujo. Los modos de uso compartido también se mantienen por flujo. Cuando se solicita acceso de eliminación en un archivo, el sistema operativo comprueba el acceso de eliminación en todos los flujos abiertos de un archivo. Si otro proceso ha abierto un flujo sin el permiso FILE_SHARE_DELETE, no se puede abrir el archivo para eliminar el acceso.

Si un archivo que se copia tiene un flujo de datos y se usa el redirector de red, el archivo solo se puede copiar si el cliente tiene los permiso de lectura y de atributos de lectura.

Convenciones de nomenclatura para flujos

El nombre completo de un flujo, cuando se especifica desde la línea de comandos del shell de Windows, es "nombre de archivo:nombre de flujo:tipo de flujo", tal como se indica en el ejemplo siguiente: "myfile.dat:stream1:$DATA".

Los caracteres que se pueden incluir en un nombre de archivo también son válidos para el nombre del flujo, incluidos los espacios. Para obtener más información, vea Asignación de nombre de un archivo. El tipo de flujo (también denominado código de tipo de atributo) es interno para el sistema de archivos NTFS. Por lo tanto, los usuarios no pueden crear tipos de flujo, pero pueden abrir los tipos del sistema de archivos NTFS existentes. Los valores del especificador de tipo de flujo siempre comienzan con el signo de dólar ($). Vea a continuación una lista de tipos de flujo.

De forma predeterminada, el flujo de datos predeterminado no tiene nombre. Para especificar completamente el flujo de datos predeterminado, use "nombre de archivo::$DATA", donde $DATA es el tipo de flujo. Esto es el equivalente a "nombre de archivo". Puede crear un flujo con nombre en el archivo mediante las convenciones de nomenclatura de archivos. Tenga en cuenta que "$DATA" es un nombre de flujo válido. Por ejemplo, el nombre completo de un flujo denominado "$DATA" en un archivo denominado "ejemplo" sería "ejemplo:$DATA:$DATA". Si ha creado un flujo denominado "bar" en el mismo archivo, su nombre completo sería "ejemplo:bar:$DATA".

Al crear y trabajar con archivos que tienen nombres con un solo carácter, agregue un prefijo con un punto seguido de una barra diagonal inversa (.) al nombre del archivo o use un nombre de ruta de acceso completo. El motivo es que Windows trata los nombres de archivo con un solo carácter como letras de unidades. Cuando se especifica una letra de unidad con una ruta de acceso relativa, un signo de dos puntos separa la letra de unidad de la ruta de acceso. Cuando hay una ambigüedad sobre si un nombre de un carácter es una letra de unidad o un nombre de archivo, Windows asume que es una letra de unidad si la cadena que sigue a los dos puntos es una ruta de acceso válida, incluso si la letra de unidad no es válida.

Tipos de flujo

A continuación se muestra la lista de tipos de flujo NTFS, también denominados códigos de tipo de atributo. Algunos de los tipos de flujo son internos de NTFS y su formato no está documentado.

Tipo de flujo Descripción
::$ATTRIBUTE_LIST Contiene una lista de todos los atributos que componen el archivo e identifica dónde se encuentra cada atributo.
::$BITMAP Mapa de bits que usan los índices para administrar el espacio libre del árbol b de un directorio. El árbol b se administra en fragmentos de 4 KB (independientemente del tamaño del clúster) y se usa para administrar la asignación de estos fragmentos. Este tipo de flujo se encuentra en todos los directorios.
::$DATA Flujo de datos. El flujo de datos predeterminado no tiene nombre. Los flujos de datos se pueden enumerar mediante las funciones FindFirstStreamW y FindNextStreamW.
::$EA Contiene datos de atributos extendidos.
::$EA_INFORMATION Contiene información de soporte técnico sobre los atributos extendidos.
::$FILE_NAME Nombre del archivo, en caracteres Unicode. Esto incluye el nombre corto del archivo, así como los vínculos físicos.
::$INDEX_ALLOCATION Tipo de flujo de un directorio. Se usa a fin de implementar la asignación de nombres de archivo para directorios grandes. Este flujo representa el propio directorio y contiene todos los datos de este. Los cambios en los flujos de este tipo se registran en el diario de cambios de NTFS. El nombre de flujo predeterminado de un tipo de flujo $INDEX_ALLOCATION es $I30, por lo que "nombreDeDirectorio", "nombreDeDirectorio::$INDEX_ALLOCATION" y "nombreDeDirectorio:$I30:$INDEX_ALLOCATION" son equivalentes.
::$INDEX_ROOT Este flujo representa la raíz del árbol b de un índice. Este tipo de flujo se encuentra en todos los directorios.
::$LOGGED_UTILITY_STREAM Similar a ::$DATA, con la diferencia de que las operaciones se registran en el diario de cambios de NTFS. Lo usa EFS y NTFS transaccional (TxF). El par ":nombreDeFlujo:$tipoDeFlujo" para EFS es ":$EFS:$LOGGED_UTILITY_STREAM" y para TxF es ":$TXF_DATA:$LOGGED_UTILITY_STREAM".
::$OBJECT_ID Id. de 16 bytes que se usa para identificar el archivo del servicio de seguimiento de vínculos.
::$REPARSE_POINT Datos de punto de repetición de análisis.

 

Uso de flujos