Frage

Ich möchte eine Datei mit beliebiger Größe unter Verwendung der Windows C/C ++ - API erstellen. Ich verwende Windows XP Service Pack 2 mit einem 32 -Bit -virtuellen Adressspeicherraum. Ich bin mit CreateFile vertraut.

SocreateFile hat jedoch kein Größenarument. Der Grund, warum ich ein Größenargument übergeben möchte, besteht darin, mir Speicherzuordnungsdateien zu erstellen, mit denen der Benutzer auf Datenstrukturen vorbestimmter Größe zugreifen kann. Könnten Sie bitte die richtige Windows C/C ++ - API -Funktion beraten, mit der ich eine Datei mit vorbestimmter Größe der arbritrischen Größe erstellen kann? Vielen Dank

War es hilfreich?

Lösung

Um dies auf Unix zu tun, versuchen Sie es zu (fordersFileze - 1) und schreiben Sie dann ein Byte. Der Wert des Byte kann alles sein, aber Null ist die offensichtliche Wahl.

Andere Tipps

Du CreateFile wie gewöhnlich, SetFilePointerEx zu der gewünschten Größe und dann rufen Sie an SetEndOfFile.

Sie benötigen keine Datei, Sie können die Seite Datei als Unterstützung für Ihre Speicher -zugeordnete Datei aus der MSDN verwenden CreateFileMapping Funktionsseite:

Wenn HFile invalid_handle_value ist, muss der aufrufende Prozess auch eine Größe für das Dateizuordnungsinjekt in den Parametern dwmaximumSizeHigh und dwmaximumsizelow angeben. In diesem Szenario erstellt createFilemapping ein Dateizuordnungsobjekt einer bestimmten Größe, das von der Systempaging -Datei anstelle einer Datei im Dateisystem unterstützt wird.

Sie können das Mapping -Objekt mit Verwendung von weiterhin freigeben DuplicateHandle.

Nach Ihren Kommentaren benötigen Sie tatsächlich plattformübergreifende Lösung. Überprüfen Sie also Steigern Sie Interprozess Bibliothek. Es bietet plattformübergreifende Speicherspeichereinrichtungen und mehr

Um dies unter Linux zu tun, können Sie Folgendes tun:

/**
 *  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;
   }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top