Pergunta

Alguém conhece uma maneira de copiar um arquivo do caminho A para o caminho B e suprimir o cache do sistema de arquivos do Windows?
O uso típico é copiar um arquivo grande de uma unidade USB ou servidor para sua máquina local.O Windows parece trocar tudo se o arquivo for realmente grande, por ex.2GiB.Prefiro exemplo em C #, mas acho que seria algum tipo de chamada Win32, se possível.

Foi útil?

Solução

Ainda mais importante, existem FILE_FLAG_WRITE_THROUGH e FILE_FLAG_NO_BUFFERING.

O MSDN tem um bom artigo sobre ambos: http://support.microsoft.com/kb/99794

Outras dicas

Em C# descobri que algo assim funciona, isso pode ser alterado para copiar diretamente para o arquivo de destino:

    public static byte[] ReadAllBytesUnbuffered(string filePath)
    {
        const FileOptions FileFlagNoBuffering = (FileOptions)0x20000000;
        var fileInfo = new FileInfo(filePath);
        long fileLength = fileInfo.Length;
        int bufferSize = (int)Math.Min(fileLength, int.MaxValue / 2);
        bufferSize += ((bufferSize + 1023) & ~1023) - bufferSize;
        using (var stream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.None,
                                           bufferSize, FileFlagNoBuffering | FileOptions.SequentialScan))
        {
            long length = stream.Length;
            if (length > 0x7fffffffL)
            {
                throw new IOException("File too long over 2GB");
            }
            int offset = 0;
            int count = (int)length;
            var buffer = new byte[count];
            while (count > 0)
            {
                int bytesRead = stream.Read(buffer, offset, count);
                if (bytesRead == 0)
                {
                    throw new EndOfStreamException("Read beyond end of file EOF");
                }
                offset += bytesRead;
                count -= bytesRead;
            }
            return buffer;
        }
    }

Não tenho certeza se isso ajuda, mas dê uma olhada Maior desempenho usando FILE_FLAG_SEQUENTIAL_SCAN.

RESUMO

Existe um sinalizador para createfile () chamado FILE_FLAG_SESTEAL_SCAN, que direcionará o Cache Manager a acessar o arquivo sequencialmente.

Qualquer pessoa que leia arquivos potencialmente grandes com acesso seqüencial pode especificar esse sinalizador para aumentar o desempenho.Esse sinalizador é útil se você estiver lendo arquivos "principalmente" sequenciais, mas ocasionalmente pula em pequenos intervalos de bytes.

Se você não se importa em usar uma ferramenta, ESEUTIL funcionou muito bem para mim.

Você pode conferir isso blog entrada comparando funções Buffered e NonBuffered IO e de onde obter ESEUTIL.

copiando algum texto do blog technet:

Portanto, observando a definição de E/S em buffer acima, podemos ver onde estão os problemas de desempenho percebidos - na sobrecarga do cache do sistema de arquivos.A E/S sem buffer (ou uma cópia de arquivo bruto) é preferida ao tentar copiar um arquivo grande de um local para outro quando não pretendemos acessar o arquivo de origem após a conclusão da cópia.Isso evitará a sobrecarga do cache do sistema de arquivos e impedirá que o cache do sistema de arquivos seja efetivamente liberado pelos dados do arquivo grande.Muitos aplicativos fazem isso chamando CreateFile() para criar um arquivo de destino vazio e, em seguida, usando as funções ReadFile() e WriteFile() para transferir os dados.CreateFile() - A função CreateFile cria ou abre um arquivo, fluxo de arquivo, diretório, disco físico, volume, buffer de console, unidade de fita, recurso de comunicação, slot de correio ou pipe nomeado.A função retorna um identificador que pode ser usado para acessar um objeto.ReadFile() - A função ReadFile lê dados de um arquivo e inicia na posição indicada pelo ponteiro do arquivo.Você pode usar esta função para operações síncronas e assíncronas.WriteFile() - A função WriteFile grava dados em um arquivo na posição especificada pelo ponteiro do arquivo.Esta função foi projetada para operação síncrona e assíncrona.Para copiar arquivos muito grandes pela rede, meu utilitário de cópia preferido é o ESEUTIL, que é um dos utilitários de banco de dados fornecidos com o Exchange.

Eseutil é uma resposta correta, também desde Win7/2008 R2, você pode usar a opção /j no Xcopy, que tem o mesmo efeito.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top