Operações de arquivo esparso

Para determinar se um sistema de arquivos dá suporte a arquivos esparsos, chame a função GetVolumeInformation e examine o sinalizador de bit FILE_SUPPORTS_SPARSE_FILES retornado por meio do parâmetro lpFileSystemFlags .

A maioria dos aplicativos não está ciente de arquivos esparsos e não criará arquivos esparsos. O fato de um aplicativo ler um arquivo esparso é transparente para o aplicativo. Um aplicativo que esteja ciente de arquivos esparsos deve determinar se seu conjunto de dados é adequado para ser mantido em um arquivo esparso. Depois que essa determinação é feita, o aplicativo deve declarar explicitamente um arquivo como esparso, usando o código de controle FSCTL_SET_SPARSE .

Depois que um aplicativo definir um arquivo como esparso, o aplicativo poderá usar o código de controle FSCTL_SET_ZERO_DATA para definir uma região do arquivo como zero. Além disso, o aplicativo pode usar o código de controle FSCTL_QUERY_ALLOCATED_RANGES para acelerar as pesquisas de dados não zero no arquivo esparso.

Quando você executa uma operação de gravação (com uma função ou operação diferente de FSCTL_SET_ZERO_DATA) cujos dados consistem em nada além de zeros, zeros serão gravados no disco durante todo o comprimento da gravação. Para zerar um intervalo do arquivo e manter a esparsa, use FSCTL_SET_ZERO_DATA.

Um aplicativo com reconhecimento de esparsa também pode definir um arquivo existente como esparso. Se um aplicativo definir um arquivo existente como esparso, ele deverá examinar o arquivo em busca de regiões que contenham zeros e usar FSCTL_SET_ZERO_DATA para redefinir essas regiões, possivelmente desalocando algum armazenamento em disco físico. Um aplicativo atualizado para reconhecimento de arquivos esparsos deve executar essa conversão.

Quando você executa uma operação de leitura de uma parte zero de um arquivo esparso, o sistema operacional pode não ler a partir da unidade de disco rígido. Em vez disso, o sistema reconhece que a parte do arquivo a ser lido contém zeros e retorna um buffer cheio de zeros sem realmente ler do disco.

Assim como acontece com qualquer outro arquivo, o sistema pode gravar dados ou ler dados de qualquer posição em um arquivo esparso. Os dados não zero que estão sendo gravados em uma parte zero anteriormente do arquivo podem resultar na alocação de espaço em disco. Zeros sendo gravados em dados não zero (somente com FSCTL_SET_ZERO_DATA) podem resultar em uma desalocação do espaço em disco.

Observação

Cabe ao aplicativo manter a esparsidade gravando zeros com FSCTL_SET_ZERO_DATA.

 

As ferramentas de desfragmentação que lidam com arquivos compactados em sistemas de arquivos NTFS manipularão corretamente arquivos esparsos em volumes do sistema de arquivos NTFS. Arquivos esparsos grandes e altamente fragmentados podem exceder a limitação do NTFS em extensões de disco antes que o espaço disponível seja usado.