Domanda

Vorrei creare un file di dimensione arbitraria utilizzando l'API di Windows C / C ++. Sto usando il Service Pack 2 di Windows XP con uno spazio di memoria di indirizzamento virtuale a 32 bit. Sono a conoscenza CreateFile.

Tuttavia CreateFile non dispone di un arument dimensioni, La ragione per cui voglio passare in un argomento dimensione è quello di permettere a me di creare file di mapping di memoria che permettono all'utente di strutture di dati di accesso di dimensione predeterminata. Potete trasmettere la corretta di Windows C / C ++ funzione API, che mi permette di creare un file di arbritrary dimensione predeterminata? Grazie

È stato utile?

Soluzione

Per fare questo su UNIX, cercano di (RequiredFileSize - 1) e poi scrivere un byte. Il valore del byte può essere qualsiasi cosa, ma zero è la scelta più ovvia.

Altri suggerimenti

È CreateFile come al solito, SetFilePointerEx alle dimensioni desiderate e poi SetEndOfFile chiamata.

Non hai bisogno di un file, è possibile utilizzare il file di paging, come il supporto per il file di memoria mappata, dalla pagina funzione di CreateFileMapping MSDN:

Se hFile è INVALID_HANDLE_VALUE, il processo chiamante deve anche specificare un formato per l'oggetto di mapping del file nei parametri dwMaximumSizeHigh e dwMaximumSizeLow. In questo scenario, CreateFileMapping crea un oggetto di mapping del file di una dimensione specificata che è sostenuta da file di paging del sistema invece che da un file nel file system.

È ancora possibile condividere l'oggetto mappatura mediante l'uso di DuplicateHandle.

secondo i vostri commenti, è effettivamente necessario cross-platform soluzione, in modo da controllare Boost biblioteca Interprocess . fornisce cross-piattaforma condivisa strutture di memoria e altro ancora

per fare questo su Linux, è possibile effettuare le seguenti operazioni:

/**
 *  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;
   }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top