Você está offline; aguardando reconexão

INFO: FILE_FLAG_WRITE_THROUGH e FILE_FLAG_NO_BUFFERING

IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine Translation ou MT), não tendo sido portanto traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.

Clique aqui para ver a versão em Inglês deste artigo: 99794
Sumário
O sinalizador FILE_FLAG_WRITE_THROUGH para CreateFile() faz com que qualquer gravações feitas essa alça para sejam gravados diretamente o arquivo sem sendo armazenada em buffer. Os dados são armazenadas em cache (armazenado no cache de disco); no entanto, ele é ainda gravado diretamente no arquivo. Esse método permite que uma operação de leitura em que dados para satisfazer a solicitação de leitura de dados armazenados em cache (se ele ainda existe), em vez de ter para fazer um arquivo lido para obter os dados. A chamada de gravação não retornará até que os dados gravados no arquivo. Isso se aplica a remotas gravações bem--o redirecionador de rede passa o sinalizador FILE_FLAG_WRITE_THROUGH para o servidor para que o servidor sabe não para satisfazer a solicitação de gravação até que os dados gravados no arquivo.

O FILE_FLAG_NO_BUFFERING leva esse conceito um passo mais e elimina todos os arquivo read-ahead buffer e cache de disco bem, para que todas as leituras são garantidas como vêm do arquivo e não de qualquer sistema buffer ou cache de disco. Ao usar FILE_FLAG_NO_BUFFERING, disco lê e grava deve ser feita nos limites do setor e buffer endereços devem ser alinhados nos limites do setor de disco na memória.

Essas restrições são necessárias porque o buffer que você passar para a leitura ou gravação API é usado diretamente para E/s no nível do dispositivo; esse nível, as endereços de buffer e setor tamanhos devem satisfazer a quaisquer restrições de alinhamento de processador e mídia do hardware que você estiver executando em.
Mais Informações
O Windows 95 CDFS (CD-ROM File System) não suporta o sinalizador FILE_FLAG_NO_BUFFERING para CreateFile(). Enquanto um FSD de 95 do Windows, como o VFAT, pode implementá-lo, FILE_FLAG_NO_BUFFERING não é um sinalizador necessário para drivers de sistema de arquivos e não é suportado por CDFS.

Este fragmento de código demonstra como setor-Alinhar dados em um buffer e passá-lo para CreateFile():
  char buf[2 * SECTOR_SIZE - 1], *p;  p = (char *) ((DWORD) (buf + SECTOR_SIZE - 1) & ~(SECTOR_SIZE - 1));  h = CreateFile(argv[1], GENERIC_READ | GENERIC_WRITE,      FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, CREATE_ALWAYS,      FILE_ATTRIBUTE_NORMAL | FILE_FLAG_NO_BUFFERING, NULL);  WriteFile(h, p, SECTOR_SIZE, &dwWritten, NULL);				
o ponteiro p é alinhado no setor e aponta dentro do buffer.

Se você tiver uma situação onde você deseja liberar todos os arquivos na unidade lógica atual, isso pode ser feito:
   hFile = CreateFile("\\\\.\\c:", ....);   FlushFileBuffers(hFile);				
esse método faz com que todos os dados armazenados em buffer de gravação para todos os arquivos abertos na partição C: seja liberado e gravados no disco. Observe que qualquer buffer feito por qualquer coisa diferente do sistema não é afetado por esta liberação; qualquer arquivo possível buffer que o tempo de execução C está fazendo em arquivos abertos com rotinas de C Run-time é afetado.

Ao abrir um arquivo remoto através da rede, o servidor armazena em cache sempre e ignora o sem sinalizador buffer especificado pelo cliente. Isso ocorre por design. O redirecionador e o servidor não podem implementar corretamente a semântica normal do FILE_FLAG_NO_BUFFERING através da rede. Em particular, o requisito para tamanho de setor, alinhado no setor de E/s não pode ser alcançado. Portanto, quando um aplicativo Win32-com base em solicita FILE_FLAG_NO_BUFFERING, redirecionador e servidor tratam isso como uma solicitação para FILE_FLAG_WRITE_THROUGH. O arquivo não é armazenado em cache no cliente, gravações vá diretamente para o servidor e para o disco no servidor e os tamanhos de leitura/gravação na rede são exatamente o que o aplicativo solicita. No entanto, o arquivo é armazenada em cache no servidor.

O cliente de cache não pode ter um efeito diferente, dependendo do tipo de E/s. Você elimina os acertos do cache ou ler antecipadamente, mas você também pode reduzir o tamanho de transmite e recebe. Em geral, para E/s seqüencial, é uma boa idéia para armazenar em cache no cliente. Para pequeno, aleatório, acesso E/s, geralmente é melhor não armazenar em cache.

Propriedades

ID do Artigo: 99794 - Última Revisão: 11/21/2006 15:47:46 - Revisão: 4.2

Interface de Programação de Aplicativos do Microsoft Win32

  • kbmt kbapi kbfileio kbinfo kbkernbase KB99794 KbMtpt
Comentários
">