una todos reemplazar otra manejo los informacion gestor ficheros duplicar crear copiar carpeta archivos archivo c# windows winapi filesystems file-copying

c# - todos - Copie un archivo sin usar el caché de archivos de Windows



manejo de archivos en c# (5)

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

¿Alguien sabe de una forma de copiar un archivo de la ruta A a la ruta B y suprimir la caché del sistema de archivos de Windows?
El uso típico es copiar un archivo grande de una unidad USB o servidor a su máquina local. Windows parece intercambiar todo si el archivo es realmente grande, por ejemplo, 2GiB. Prefiero el ejemplo en C #, pero supongo que sería una llamada de Win32 de algún tipo si es posible.


No estoy seguro de si esto ayuda, pero eche un vistazo a la mejora de rendimiento mediante FILE_FLAG_SEQUENTIAL_SCAN .

RESUMEN

Hay un indicador para CreateFile () llamado FILE_FLAG_SEQUENTIAL_SCAN que dirigirá el Administrador de caché para acceder al archivo secuencialmente.

Cualquiera que lea archivos potencialmente grandes con acceso secuencial puede especificar este indicador para un mayor rendimiento. Este indicador es útil si está leyendo archivos que son "principalmente" secuenciales, pero ocasionalmente omite intervalos pequeños de bytes.


Si no te importa usar una herramienta, ESEUTIL funcionó muy bien para mí.

Puede consultar esta entrada de blog comparando las funciones de IO con Buffered y NonBuffered y desde dónde obtener ESEUTIL.

copiando un texto del blog technet:

Entonces, al observar la definición de E / S almacenada en el búfer anterior, podemos ver dónde se encuentran los problemas de rendimiento percibidos: en la sobrecarga de la memoria caché del sistema de archivos. Se prefiere la E / S sin búfer (o una copia sin formato) cuando se intenta copiar un archivo grande de una ubicación a otra cuando no tenemos la intención de acceder al archivo fuente una vez que se completa la copia. Esto evitará la sobrecarga de la memoria caché del sistema de archivos y evitará que la memoria caché del sistema de archivos se vacíe de forma efectiva por los datos de archivos de gran tamaño. Muchas aplicaciones logran esto llamando a CreateFile () para crear un archivo de destino vacío, luego usando las funciones ReadFile () y WriteFile () para transferir los datos. CreateFile (): la función CreateFile crea o abre un archivo, secuencia de archivos, directorio, disco físico, volumen, búfer de consola, unidad de cinta, recurso de comunicaciones, ranura de correo o canalización con nombre. La función devuelve un identificador que se puede usar para acceder a un objeto. ReadFile (): la función ReadFile lee datos de un archivo y comienza en la posición que indica el puntero del archivo. Puede usar esta función para operaciones síncronas y asíncronas. WriteFile (): la función WriteFile escribe datos en un archivo en la posición especificada por el puntero del archivo. Esta función está diseñada para operación síncrona y asíncrona. Para copiar archivos de la red que son muy grandes, mi utilidad de copia favorita es ESEUTIL, que es una de las utilidades de base de datos provistas con Exchange.


En C # he encontrado algo como esto para trabajar, esto se puede cambiar para copiarlo directamente en 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; } }


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