FSCTL_SET_SPARSE IOCTL (winioctl.h)

Marca o arquivo indicado como esparso ou não esparso. Em um arquivo esparso, grandes intervalos de zeros podem não exigir alocação de disco. O espaço para dados diferentes de zero será alocado conforme necessário à medida que o arquivo for gravado.

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

BOOL DeviceIoControl(
  (HANDLE) hDevice,                         // handle to a file
  FSCTL_SET_SPARSE,                         // dwIoControlCode
  (PFILE_SET_SPARSE_BUFFER) lpInBuffer,     // input buffer
  (DWORD) nInBufferSize,                    // size of input buffer
  NULL,                                     // lpOutBuffer
  0,                                        // nOutBufferSize
  (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 código de controle FSCTL_SET_SPARSE define ou limpa o atributo FILE_ATTRIBUTE_SPARSE_FILE do arquivo especificado.

Windows Server 2008 R2, Windows 7, Windows Server 2008 e Windows Vista: Uma operação clara é válida somente em arquivos que não têm mais regiões esparsas. A execução de uma operação clara em um arquivo com regiões esparsas pode ter resultados imprevisíveis. Você pode determinar se há regiões esparsas em um arquivo usando o código de controle FSCTL_QUERY_ALLOCATED_RANGES .

Se o parâmetro lpInBuffer for NULL, a operação se comportará da mesma forma que se o membro SetSparse da estrutura FILE_SET_SPARSE_BUFFER fosse TRUE. Em outras palavras, a operação define o arquivo como um arquivo esparso.

Windows Server 2003 e Windows XP: Se uma estrutura FILE_SET_SPARSE_BUFFER for passada no parâmetro lpInBuffer , o único valor válido para o membro SetSparse será TRUE, que define o arquivo como um arquivo esparso. Passar FALSE na estrutura FILE_SET_SPARSE_BUFFER fará com que essa chamada de função falhe. A única maneira de limpar esse atributo é substituir o arquivo (por exemplo, chamando a função CreateFile pelo sinalizador CREATE_ALWAYS ).

Não é possível criar um arquivo esparso chamando CreateFile com FILE_ATTRIBUTE_SPARSE_FILE no parâmetro dwFlagsAndAttributes . Você deve usar o código de controle FSCTL_SET_SPARSE .

Observe que os carimbos de data/hora podem não ser atualizados corretamente para um arquivo remoto. Para garantir resultados consistentes, use E/S sem buffer.

No Windows 8 e no 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) Consulte Comentário
ReFS (Sistema de Arquivos Resiliente) Sim

Os CsvFs farão E/S redirecionada para arquivos esparsos. CsvFs permite tornar o arquivo esparso somente quando o arquivo é aberto exclusivamente por um nó. O Failover Transparente do SMB 3.0 não dá suporte à gravação em buffer.

Requisitos

   
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