Войти
ПрограммированиеПодсказкиОбщее

Ускорение загрузки файлов в Windows

Автор:

Стандартный способ загрузки файлов (fopen, open, _open, fstream etc) слишком медленный по времени исполнения. Поэтому мы воспользуемся следующим кодом.

// Объявляем дескрипторы файла 
HANDLE fh, fh_map;

// Открываем файл 
fh = CreateFile(filename.c_str(), GENERIC_READ, NULL, NULL, 
                OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

// Если неудачно, то выходим
if(fh == INVALID_HANDLE_VALUE)
  return false;

// Получаем размер файла (если надо)
size = GetFileSize(fh, NULL);

// !!!!!!!!!!! Создаем file mapping object (подробную инфу смотрим в MSDN)
fh_map = CreateFileMapping(fh, NULL, PAGE_READONLY, NULL, NULL, filename.c_str());

// Если неудачно, то увы :(
if(fh_map == NULL)
{
  CloseHandle(fh);
  return false;
};


// Функция MapViewOfFile возвращает указатель на массив с данными файла
void* view_map;
view_map = MapViewOfFile(fh_map, FILE_MAP_READ, NULL, NULL, NULL);
if(view_map == NULL)
{
  CloseHandle(fh_map);
  CloseHandle(fh);
  return false;
};

char* data = static_cast<char*>(view_map);

А вот так это делается в POSIX-е:

#include <cstdio>
#include <cerrno>
#include <cstring>
#include <sys/stat.h>
#include <sys/fcntl.h>
#include <sys/mman.h>

// открыть файл
int mappedFile = open(FileName.c_str(), O_RDONLY);
if (-1 == mappedFile) {  
  fprintf(stderr, "I/O Error: s%\n", strerror(errno));
  return false;
}
// размер файла
struct stat st;
stat(fname, &st);
off_t length = st.st_size;
// отображение файла
char* ptr = reinterpret_cast<char *>(mmap(0, length, PROT_READ, MAP_PRIVATE, mappedFile, 0));
if (MAP_FAILED == ptr)  {
  fprintf(stderr, "File Mapping Error: %s\n", strerror(errno));
  close(mappedFile);
mappedFile = -1;
  return false;  
}

// завершение работы
munmap(ptr, length );
close(mappedFile);
mappedFile = -1;

Вот и все. Скорость загрузки ощутима возросла (правда стоит отметить, что в случае с файлами небольшого размера ощутимого результата не видно, но если надо загрузить игровой архив... Прирост во времени огромен)

Источник MSDN.

#загрузка, #файлы

9 июня 2009 (Обновление: 2 янв 2014)

Комментарии [55]