INFO: FILE_FLAG_WRITE_THROUGH e FILE_FLAG_NO_BUFFERING

Traduções deste artigo Traduções deste artigo
ID do artigo: 99794 - Exibir os produtos aos quais esse artigo se aplica.
Expandir tudo | Recolher tudo

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: terça-feira, 21 de novembro de 2006 - Revisão: 4.2
A informação contida neste artigo aplica-se a:
  • Interface de Programação de Aplicativos do Microsoft Win32 nas seguintes plataformas
    • Microsoft Windows NT Advanced Server 3.1
    • Microsoft Windows NT 4.0
    • Microsoft Windows NT 3.51 Service Pack 5
    • Microsoft Windows NT 4.0
    • Microsoft Windows 95
    • Microsoft Windows 98 Standard Edition
    • the operating system: Microsoft Windows 2000
    • Microsoft Windows Millennium Edition
    • the operating system: Microsoft Windows XP
Palavras-chave: 
kbmt kbapi kbfileio kbinfo kbkernbase KB99794 KbMtpt
Tradução automática
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

Submeter comentários

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com