Question

Je voudrais créer un fichier de taille arbitraire en utilisant l'API Windows C / C ++. J'utilise Service Pack 2 Windows XP avec un espace de mémoire d'adresse virtuelle 32 bits. Je connais CreateFile.

Cependant CreateFile ne dispose pas d'un arument de taille, la raison pour laquelle je veux passer un argument de taille est de me permettre de créer des fichiers de mappage de mémoire qui permettent à l'utilisateur de structures de données d'accès de taille prédéterminée. Pourriez-vous conseiller de la fonction appropriée API ++ de Windows C / C qui me permettent de créer un fichier de arbritrary taille prédéterminée? Merci

Était-ce utile?

La solution

Pour ce faire, sous UNIX, cherchent à (RequiredFileSize - 1), puis écrire un octet. La valeur de l'octet peut être rien, mais zéro est le choix évident.

Autres conseils

Vous CreateFile comme d'habitude, SetFilePointerEx à la taille désirée puis SetEndOfFile appel.

Vous n'avez pas besoin d'un fichier, vous pouvez utiliser le fichier d'échange que le soutien pour votre fichier mappé en mémoire, à partir de la page de la fonction CreateFileMapping MSDN:

  

Si hFile est INVALID_HANDLE_VALUE, le processus d'appel doit également spécifier la taille de l'objet de mappage de fichier dans les paramètres dwMaximumSizeHigh et dwMaximumSizeLow. Dans ce scénario, CreateFileMapping crée un objet de mappage de fichier d'une taille spécifiée qui est soutenue par le fichier d'échange du système au lieu d'un fichier dans le système de fichiers.

Vous pouvez toujours partager l'objet de cartographie par l'utilisation de DuplicateHandle.

selon vos commentaires, vous avez réellement besoin solution multi plate-forme, afin de vérifier Boostez la bibliothèque de Interprocess. il fournit des installations de mémoire partagée multi-plateformes et plus

pour le faire sous Linux, vous pouvez faire ce qui suit:

/**
 *  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;
   }
}
scroll top