Fluxos de arquivos (sistemas de arquivos locais)

Um fluxo é uma sequência de bytes. No sistema de arquivos NTFS, os fluxos contêm os dados gravados em um arquivo, e isso fornece mais informações sobre um arquivo do que os atributos e as propriedades. Por exemplo, você pode criar um fluxo que contém palavras-chave de pesquisa ou a identidade da conta de usuário que cria um arquivo.

Cada fluxo associado a um arquivo tem um tamanho de alocação, um tamanho real e um comprimento de dados válido próprios:

  • O tamanho da alocação é a quantidade de espaço em disco reservada para um fluxo.
  • O tamanho real é o número de bytes que estão sendo usados por um chamador.
  • O VDL (comprimento de dados válido) é o número de bytes inicializados do tamanho da alocação para o fluxo.

Cada fluxo também mantém um estado próprio para compactação, criptografia e dispersão. O atributo FILE_ATTRIBUTE_SPARSE_FILE no arquivo será definido no membro dwFileAttributes da estrutura WIN32_FIND_DATA retornada das funções FindFirstFile, FindFirstFileEx e FindNextFile se um dos fluxos já tiver sido esparso. GetFileAttributes, GetFileAttributesEx, GetFileAttributesTransacted, GetFileInformationByHandle e GetFileInformationByHandleEx retornam o estado esparso do fluxo de dados padrão se nenhum fluxo é especificado.

Não há horas de arquivo associados a um fluxo. As horas de um arquivo são atualizadas quando qualquer fluxo em um arquivo é atualizado.

Os bloqueios oportunistas são mantidos por fluxo. Os modos de compartilhamento também são mantidos por fluxo. Quando o acesso de exclusão é solicitado em um arquivo, o sistema operacional verifica o acesso de exclusão em todos os fluxos abertos em um arquivo. Se outro processo tiver aberto um fluxo sem a permissão FILE_SHARE_DELETE, você não poderá abrir o arquivo para excluir o acesso.

Se um arquivo que está sendo copiado tiver um fluxo de dados e o redirecionador de rede for usado, o arquivo só poderá ser copiado se o cliente tiver as permissões de leitura e de leitura de atributos.

Convenções de nomenclatura para fluxos

Quando especificado na linha de comando do shell do Windows, o nome completo de um fluxo é "nome de arquivo:nome do fluxo:tipo de fluxo", como no seguinte exemplo: "myfile.dat:stream1:$DATA".

Todos os caracteres que são válidos para um nome de arquivo também são válidos para o nome do fluxo, incluindo espaços. Para obter mais informações, confira Como nomear um arquivo. O tipo de fluxo (também chamado de código de tipo de atributo) é interno para o sistema de arquivos NTFS. Portanto, os usuários não podem criar tipos de fluxos, mas podem abrir tipos de sistema de arquivos NTFS existentes. Os valores do especificador de tipo de fluxo sempre começam com o símbolo de cifrão ($). Veja abaixo uma lista de tipos de fluxo.

Por padrão, o fluxo de dados padrão não tem nome. Para especificar por completo o fluxo de dados padrão, use "nomedearquivo::$DATA", sendo que $DATA é o tipo de fluxo. Isso é o equivalente a "nomedearquivo". Você pode criar um fluxo nomeado no arquivo usando as convenções de nomenclatura de arquivo. Observe que "$DATA" é um nome de fluxo válido. Por exemplo, o nome completo de um fluxo chamado "$DATA" em um arquivo chamado "sample" será "sample:$DATA:$DATA". Se você criou um fluxo chamado "bar" no mesmo arquivo, o nome completo dele será "sample:bar:$DATA".

Ao criar e trabalhar com arquivos que têm nomes de um caractere, coloque um ponto seguido de uma barra invertida (.) como prefixo do nome do arquivo ou use um nome de caminho totalmente qualificado. O motivo para fazer isso é que o Windows trata os nomes de arquivos de um caractere como letras da unidade. Quando uma letra da unidade é especificada com um caminho relativo, dois-pontos separam a letra da unidade do caminho. Quando houver ambiguidade quanto ao fato de determinado nome de um caractere ser uma letra de unidade ou um nome de arquivo, o Windows assumirá que é uma letra de unidade se a cadeia de caracteres após os dois pontos for um caminho válido, mesmo que a letra da unidade seja inválida.

Tipos de fluxo

Veja a seguir a lista de tipos de fluxo NTFS, também chamados de códigos de tipo de atributo. Alguns dos tipos de fluxo são internos ao NTFS, e o formato deles não está documentado.

Tipo de fluxo Descrição
::$ATTRIBUTE_LIST Contém uma lista de todos os atributos que compõem o arquivo e identifica o local em que cada atributo se encontra.
::$BITMAP Um bitmap usado por índices para gerenciar o espaço livre da árvore b para um diretório. A árvore b é gerenciada em partes de 4 KB (independentemente do tamanho do cluster), e isso é usado para gerenciar a alocação dessas partes. Esse tipo de fluxo está presente em todos os diretórios.
::$DATA Fluxo de dados. O fluxo de dados padrão não tem nome. Os fluxos de dados podem ser enumerados usando as funções FindFirstStreamW e FindNextStreamW.
::$EA Contém dados de Atributos Estendidos.
::$EA_INFORMATION Contém informações de suporte sobre os Atributos Estendidos.
::$FILE_NAME O nome do arquivo, em caracteres Unicode. Isso inclui o nome curto do arquivo, bem como todos os links físicos.
::$INDEX_ALLOCATION O tipo de fluxo de um diretório. Usado para implementar a alocação de nome de arquivo para diretórios grandes. Esse fluxo representa o próprio diretório e contém todos os dados do diretório. As alterações nos fluxos desse tipo são registradas no diário de alterações do NTFS. O nome do fluxo padrão de um tipo de fluxo $INDEX_ALLOCATION é $I 30, ou seja, "DirName", "DirName::$INDEX_ALLOCATION" e "DirName:$I 30:$INDEX_ALLOCATION" são equivalentes.
::$INDEX_ROOT Esse fluxo representa a raiz da árvore b de um índice. Esse tipo de fluxo está presente em todos os diretórios.
::$LOGGED_UTILITY_STREAM Semelhante a ::$DATA, mas as operações são registradas no diário de alterações do NTFS. Usado pelo EFS e pelo TxF (NTFS Transacional). O par ":StreamName:$StreamType" para o EFS é ":$EFS:$LOGGED_UTILITY_STREAM" e para o TxF é ":$TXF_DATA:$LOGGED_UTILITY_STREAM".
::$OBJECT_ID Uma ID de 16 bytes usada para identificar o arquivo para o serviço de acompanhamento de link.
::$REPARSE_POINT Os dados do ponto de nova análise.

 

Como usar fluxos