使用Windows C ++ API创建任意大小的文件

时间:2011-01-20 20:52:50

标签: c++ c createfile

我想使用Windows C / C ++ API创建任意大小的文件。我正在使用具有32位虚拟地址内存空间的Windows XP Service Pack 2。我熟悉CreateFile。

然而,CreateFile没有大小arument,我想传递一个size参数的原因是允许我创建内存映射文件,允许用户访问预定大小的数据结构。你能否告诉我正确的Windows C / C ++ API函数,它允许我创建一个预定大小的arcoitrary文件?谢谢

5 个答案:

答案 0 :(得分:8)

您照例CreateFileSetFilePointerEx达到所需尺寸,然后拨打SetEndOfFile

答案 1 :(得分:2)

您不需要文件,您可以使用页面文件作为内存映射文件的后盾,来自MSDN CreateFileMapping功能页面:

  

如果hFile为INVALID_HANDLE_VALUE,则调用进程还必须在dwMaximumSizeHigh和dwMaximumSizeLow参数中指定文件映射对象的大小。在这种情况下,CreateFileMapping创建一个指定大小的文件映射对象,该对象由系统页面文件而不是文件系统中的文件支持。

您仍然可以使用DuplicateHandle分享映射对象。

答案 2 :(得分:2)

要在UNIX上执行此操作,请尝试(RequiredFileSize - 1)然后写入一个字节。字节的值可以是任何值,但零是显而易见的选择。

答案 3 :(得分:1)

根据您的意见,您实际上需要跨平台解决方案,因此请检查Boost Interprocess库。它提供跨平台的共享内存设施和更多

答案 4 :(得分:0)

要在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;
   }
}