FSCTL_QUERY_ALLOCATED_RANGES IOCTL (winioctl.h)

Verifica um arquivo ou fluxo alternativo procurando intervalos que podem conter dados diferentes de zero. Somente arquivos compactados ou esparsos podem ter intervalos zerados conhecidos pelo sistema operacional. Para outros arquivos, o buffer de saída conterá apenas uma única entrada que contém o ponto de partida e o comprimento solicitado.

Para executar essa operação, chame a função DeviceIoControl com os parâmetros a seguir.

BOOL DeviceIoControl(
  (HANDLE) hDevice,                 // handle to file
  FSCTL_QUERY_ALLOCATED_RANGES,     // dwIoControlCode
  (LPVOID) lpInBuffer,              // input buffer
  (DWORD) nInBufferSize,            // size of input buffer
  (LPVOID) lpOutBuffer,             // output buffer
  (DWORD) nOutBufferSize,           // size of output buffer
  (LPDWORD) lpBytesReturned,        // number of bytes returned
  (LPOVERLAPPED) lpOverlapped       // OVERLAPPED structure
);

Comentários

Para obter as implicações de E/S sobreposta nesta operação, consulte a seção Comentários de DeviceIoControl.

O sistema de arquivos NTFS arredonda o deslocamento do arquivo de entrada para baixo até um limite conveniente e o comprimento até um limite conveniente e, em seguida, começa a percorrer o arquivo.

O sistema operacional não rastreia cada parte de zero (0) ou dados diferentes de zero. Como zero (0) é muitas vezes um datum perfeitamente legal, seria enganoso. Em vez disso, o sistema rastreia intervalos em que o espaço em disco é alocado. Quando nenhum espaço em disco é alocado, todos os dados são considerados zero (0). O armazenamento alocado pode conter zero (0) ou dados diferentes de zero. Portanto, tudo o que essa operação faz é retornar informações sobre partes do arquivo em que dados diferentes de zero podem estar localizados. Cabe ao aplicativo verificar essas partes do arquivo de acordo com as convenções de dados do aplicativo.

Cada entrada na matriz de saída contém um deslocamento e um comprimento que indica um intervalo no arquivo que pode conter dados diferentes de zero. Os dados reais diferentes de zero, se houver, estão em algum lugar dentro desse intervalo, e o programa de chamada deve verificar mais dentro do intervalo para localizá-los e determinar se eles realmente são dados válidos. Várias instâncias de dados válidos podem existir dentro do intervalo.

Os intervalos alocados estão sujeitos à regra de que um arquivo remoto (rede) mapeado na memória e um identificador aberto para o arquivo não são necessariamente coerentes. Se você tiver mapeado um arquivo de rede esparso e gravado dados não zero em regiões não alocadas anteriormente do arquivo, o espaço em disco será alocado para os novos dados. No entanto, uma chamada para FSCTL_QUERY_ALLOCATED_RANGES depois disso não necessariamente retornaria uma lista correta de regiões alocadas. Para garantir a coerência entre a memória de exibição e o identificador de arquivo, libere os dados para o arquivo com a função FlushViewOfFile .

Em Windows 8 e Windows Server 2012, esse código é compatível com as tecnologias a seguir.

Tecnologia Com suporte
Protocolo SMB (SMB) 3.0 Sim
TFO (Failover transparente) do SMB 3.0 Sim
SMB 3.0 com compartilhamentos de arquivos de expansão (SO) Sim
Sistema de arquivos de Volume Compartilhado Clusterizado (CsvFS) Sim
ReFS (Sistema de Arquivos Resiliente) No

Requisitos

Requisito Valor
Cliente mínimo com suporte Windows XP [somente aplicativos da área de trabalho]
Servidor mínimo com suporte Windows Server 2003 [somente aplicativos da área de trabalho]
Cabeçalho winioctl.h (inclua Windows.h)

Confira também