Создание файла произвольного размера с использованием API Windows C ++

StackOverflow https://stackoverflow.com/questions/4752457

  •  13-10-2019
  •  | 
  •  

Вопрос

Я хотел бы создать файл произвольного размера, используя API Windows C/C ++. Я использую Service Pack 2 Windows XP с 32 -битным пространством памяти виртуального адреса. Я знаком с Createfile.

Однако Createfile не имеет размера арумента, причина, по которой я хочу пройти в аргументе размера, заключается в том, чтобы позволить мне создавать файлы отображения памяти, которые позволяют пользователю получить доступ к структурам данных предопределенного размера. Не могли бы вы посоветовать соответствующей функции API Windows C/C ++, которая позволяет мне создать файл арбритрарного предопределенного размера? Спасибо

Это было полезно?

Решение

Чтобы сделать это на UNIX, попытайтесь (обязательно определить - 1), а затем написать байт. Значение байта может быть чем угодно, но ноль является очевидным выбором.

Другие советы

Ты CreateFile по-прежнему, SetFilePointerEx к желаемому размеру, а затем позвоните SetEndOfFile.

Вам не нужен файл, вы можете использовать PageFile в качестве поддержки для вашего файла с отображением памяти, из MSDN CreateFileMapping Страница функции:

Если hfile является vallid_handle_value, процесс вызова также должен указать размер для объекта отображения файлов в параметрах DWMaximumSizeHigh и DWMaximumSizeLow. В этом сценарии CreateFileMapping создает объект сопоставления файлов указанного размера, который поддерживается системой подготовительного файла, а не файлом в файловой системе.

Вы все еще можете поделиться объектом отображения с использованием DuplicateHandle.

Согласно вашим комментариям, вам действительно нужно кроссплатформенное решение, поэтому проверьте Повысить межпроцесс библиотека. Он обеспечивает кроссплатформенную общую память и многое другое

Чтобы сделать это на Linux, вы можете сделать следующее:

/**
 *  Clear the umask permissions so we 
 *  have full control of the file creation (see man umask on Linux)
 */
mode_t origMask = umask(0);

int fd = open("/tmp/file_name",
      O_RDWR, 00666);

umask(origMask);
if (fd < 0)
{
  perror("open fd failed");
  return;
}


if (ftruncate(fd, size) == 0)
{
   int result = lseek(data->shmmStatsDataFd, size - 1, SEEK_SET);
   if (result == -1)
   {
     perror("lseek fd failed");
     close(fd);
     return ;
   }

   /* Something needs to be written at the end of the file to
    * have the file actually have the new size.
    * Just writing an empty string at the current file position will do.
    *newDataSize
    * Note:
    *  - The current position in the file is at the end of the stretched
    *    file due to the call to lseek().
    *  - An empty string is actually a single '\0' character, so a zero-byte
    *    will be written at the last byte of the file.
    */
   result = data->write(fd, "", 1);
   if (result != 1)
   {
     perror("write fd failed");
     close(fd);

     return;
   }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top