Syntax von WriteFile()
-
Hallo,
ich habe Schwierigkeiten mit CreateFile() bzw WriteFile().
Dieses Beispiel legt zwar eine Datei an, die ist aber 0 Byte groß:
const int GB = pow(2, 30); //Gigabyte string filename = ":/hdbench_file"; //Name des Benchfile filename = partChar + filename; int filesize = GB; //Größe des Benchfile HANDLE benchFile = CreateFile(filename.c_str(), GENERIC_WRITE | GENERIC_READ, FILE_SHARE_READ, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); WriteFile(benchFile, 0, filesize, NULL, NULL);während dieses zwar eine Datei mit dem Inhalt 'test' erzeugt, aber es kommt '*.exe funktioniert nicht mehr':
string test = "test"; WriteFile(benchFile, test.c_str(), test.size(), NULL, NULL);Also irgendwas scheine ich grundlegend falsch zu machen?
-
lpNumberOfBytesWritten ist ein out-Parameter, er will da also was reinschreiben. Wenn du ihm einen Nullzeiger übergibst, ist es kein Wunder, dass es kracht.
Lege eine DWORD-Variable an und übergib ihm die Adresse.
-
Ok danke. Dann klappt schon mal das untere Beispiel, aber beim oberen wird immer nur noch eine 0 Byte-Datei angelegt?
-
Na ja, du übergibst auch hier einen Nullzeiger. Es kracht wahrscheinlich diesmal nicht, weil der Zeiger auf 0 geprüft wird. Du sollst dort einen Puffer angeben, in dem Daten zum Schreiben sind. Probier doch mal, 10 Bytes in einem Puffer abzulegen und diese in die Datei zu schreiben.
-
Meinst Du so?
int filesize = GB; //Größe des Benchfile int *filebuffer = new int [filesize]; DWORD bytesWritten = 0; HANDLE benchFile = CreateFile(filename.c_str(), GENERIC_WRITE | GENERIC_READ, FILE_SHARE_READ, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); WriteFile(benchFile, filebuffer, filesize, &bytesWritten, NULL);Das klappt nicht.
Das habe ich auch versucht:
DWORD filesize = GB; //Größe des Benchfile LPCVOID *filebuffer = new LPCVOID [filesize];
-
Ich fürchte, ein Gigabyte Speicher vom Heap anzufordern könnte ein wenig die Kapazitäten des Systems sprengen (und btw sind int oder void* größer als ein Byte). Bei der Größe ist es vermutlich günstiger, die Datei stückweise zu füllen.
-
Ohje, damit habe ich gar nicht gerechnet

Eben probiert, und bei 50 und 100 MB werden auch genauso große Dateien angelegt.
Dann danke ich erst mal.
-
Ich meinte 10 Bytes, nicht dass du es mit deinem GB weiter versuchst.
Fange klein an, um zu sehen, ob generell das Schreiben funktioniert. Dann kannst du z.B. mehrere WriteFile-Anweisungen in einer Schleife ausführen.
-
Jupp, wie gesagt, das ist mir gar nicht in den Sinn gekommen
Und dazu gab es mit file.write() auch bei diesen Größen keine Probleme.Aber nochmals danke.
-
Habe nochmals ne Frage zu der Größe von einem Byte.
In beiden Fällen wird eine 10 Byte große Datei angelegt und bytesWritten ist auch 10:
int filesize = 10; //Größe des Benchfile char *filebuffer = new char [filesize]; //Speicher für Benchfile reservieren DWORD bytesWritten = 0; WriteFile(benchFile, filebuffer, filesize, &bytesWritten, NULL);string text = "0000000000"; //10 Zeichen DWORD bytesWritten = 0; WriteFile(benchFile, text.c_str(), text.size(), &bytesWritten, NULL);Das klappt auch mit beliebig anderen Größen.
Also kann man doch davon ausgehen, das meine Variable filesize als auch *filebuffer bytegenau ist?
-
Sorry, habe noch ne Frage. Irgendwie steige ich nicht so richtig durch die msdn-Dokumentation durch und ich bin zugegeben im Moment auch etwas ungeduldig.
Welcher Parameter bei CreateFile() ist dafür zuständig, ob die Datei erfolgreich angelegt wurde und was liefert er zurück? Also zB wenn ein ungültiger Partitionsbuchstabe angegeben wurde?
EDIT: Ok, Stichwort ist INVALID_HANDLE_VALUE