Копирование файла без использования кэша файлов windows
кто-нибудь знает способ копирования файла с пути A на путь B и подавления кэша файловой системы Windows?
Обычно используется копирование большого файла с USB-накопителя или сервера на локальный компьютер. Windows, похоже, меняет все, если файл действительно большой, например, 2GiB.
Предпочитаю пример в C#, но я предполагаю, что это будет вызов Win32, если это возможно.
5 ответов
Что еще более важно, есть FILE_FLAG_WRITE_THROUGH и FILE_FLAG_NO_BUFFERING.
MSDN имеет хорошую статью о них обоих:http://support.microsoft.com/kb/99794
В C# я нашел что-то вроде этого для работы, это можно изменить, чтобы скопировать непосредственно в файл назначения:
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;
}
}
Я не уверен, что это помогает, Но взгляните на повышение производительности с помощью FILE_FLAG_SEQUENTIAL_SCAN.
резюме
существует флаг для CreateFile() называется FILE_FLAG_SEQUENTIAL_SCAN, который направит диспетчер кэша на доступ к файлу последовательно.
любой, кто читает потенциально большие файлы с последовательным доступом смогите определить этот флаг для повышения производительности. Этот флаг полезен, если вы чтение файлы, которые являются" в основном " последовательными, но вы иногда пропускаете небольшие диапазоны байтов.
Если вы не возражаете использовать инструмент, ESEUTIL отлично работал для меня.
вы можете проверить это блог запись, сравнивающая Буферизованные и не Буферизованные функции ввода-вывода и откуда получить ESEUTIL.
копирование текста из блога technet:
Итак, глядя на определение буферизованного ввода-вывода выше, мы можем видеть, где возникают проблемы с производительностью-в накладных расходах кэша файловой системы. Unbuffered I / O (или raw-копия файла) предпочтительнее, когда при попытке скопировать большой файл из одного места в другое, когда мы не намерены открыть исходный файл после завершения копирования. Это позволит избежать накладных расходов кэша файловой системы и предотвратить эффективную очистку кэша файловой системы большими файловыми данными. Многие приложения выполняют это, вызывая CreateFile() для создания пустого файла назначения, а затем используя функции ReadFile() и WriteFile () для передачи данных. CreateFile () - функция CreateFile создает или открывает файл, поток файлов, каталог, физический диск, том, буфер консоли, ленточный накопитель, ресурс связи, mailslot или именованный канал. Функция возвращает дескриптор, который можно использовать для доступа к объекту. ReadFile () - функция ReadFile считывает данные из файла и начинает с позиции, указанной указателем файла. Эту функцию можно использовать как для синхронных, так и асинхронных операций. WriteFile () - функция WriteFile записывает данные в файл в позиции, указанной указатель файла. Эта функция предназначена как для синхронной, так и для асинхронной работы. Для копирования файлов по сети, которые очень велики, моя утилита копирования - ESEUTIL, которая является одной из утилит базы данных, предоставляемых Exchange.
Eseutil-правильный ответ, также с Win7 / 2008 R2 вы можете использовать переключатель /j в Xcopy, который имеет тот же эффект.