Pregunta

Alguien sabe de una forma de copiar un archivo desde la ruta, Un camino de B y la supresión del sistema de archivos de Windows caché?
El uso típico es la copia de un archivo de gran tamaño desde una unidad USB, o el servidor a su máquina local.Windows parece swap con todo, si el archivo es muy grande, por ejemplo,2GiB.Prefieren ejemplo en C#, pero supongo que esto sería una llamada de Win32 de algún tipo, si es posible.

¿Fue útil?

Solución

Aún más importante, hay FILE_FLAG_WRITE_THROUGH y FILE_FLAG_NO_BUFFERING.

MSDN tiene un buen artículo sobre ambos: http://support.microsoft.com/kb/99794

Otros consejos

En C# he encontrado algo como esto para el trabajo, esto puede ser cambiado a copiar directamente el archivo 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;
        }
    }

No estoy seguro de si esto ayuda, pero echa un vistazo a El aumento de Rendimiento con el Uso de FILE_FLAG_SEQUENTIAL_SCAN.

RESUMEN

Hay una bandera para CreateFile() llama FILE_FLAG_SEQUENTIAL_SCAN que dirigirá el Administrador de Caché para el archivo de acceso secuencial.

Cualquiera que lea potencialmente archivos de gran tamaño con acceso secuencial puede especificar este indicador para un mayor rendimiento.Este indicador es útil si usted está leyendo los archivos que son "en su mayoría" secuencial, pero de vez en cuando saltar más pequeños rangos de bytes.

Si usted no cuenta con una herramienta ESEUTIL trabajado muy bien para mí.

Usted puede comprobar fuera de este blog la entrada de la comparación de Búfer y NonBuffered IO funciones y de dónde obtener ESEUTIL.

copiar texto desde el blog de technet:

Así que mirando la definición de búfer de e/S de arriba, podemos ver donde la percepción de problemas de rendimiento de la mentira - en el sistema de archivos de la caché de sobrecarga.Sin búfer de e/S (o un archivo raw copy) es preferido al intentar copiar un archivo grande de un lugar a otro cuando no tenemos la intención de acceder al archivo de origen una vez finalizada la copia.Esto evitará que el sistema de archivos de caché de la sobrecarga y evitar la caché del sistema de archivos efectiva sonrojadas por el gran archivo de datos.Muchas aplicaciones lograr esta llamando a CreateFile() para crear un vacío de archivo de destino, a continuación, utilizando el ReadFile() y WriteFile() las funciones de transferencia de los datos.CreateFile() - La función CreateFile crea o abre un archivo de secuencia de archivo, directorio, disco físico, el volumen de la consola, de amortiguamiento, de la unidad de cinta, las comunicaciones de los recursos, correo, o la canalización con nombre.La función devuelve un identificador que puede ser utilizado para obtener acceso a un objeto.ReadFile() - La función ReadFile lee datos de un archivo, y se inicia en la posición en la que el puntero de archivo se indica.Puede utilizar esta función para tanto sincrónica y asincrónica de las operaciones.WriteFile() - La función WriteFile escribe datos a un archivo en la posición especificada por el puntero de archivo.Esta función está diseñada para que tanto sincrónico y asincrónico.Para copiar archivos en la red que son muy grandes, mi utilidad de copia de elección es ESEUTIL que es una de las utilidades de base de datos proporcionada con Exchange.

Eseutil es una respuesta correcta, también desde Win7 / 2008 R2, puede utilizar el modificador /j en Xcopy, que tiene el mismo efecto.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top