2009-07-03 8 views
1

Ich habe zwei Griffe, und sie sind aus der gleichen Datei erstellt,Frage zum Betrieb auf Dateien in Windows

in einem solchen Zustand möchte ich mich auf schreiben, von 1 bis 100 unter Verwendung des ersten GRIFF versetzt,

und 101-200 die 2. GRIFF, 201-300 mit dem ersten Griff,

...,

Wie kann ich diese Operation machen scheint wie eine sequentielle Schreib und keine Zeit verschwendet mit

zwischen dem Positionieren der Zeiger im GRIFF?

+0

Es ist schwer, eine gute Antwort darauf zu geben? Warum können Sie nicht denselben Griff verwenden und die Daten nur sequentiell schreiben? – Goz

+0

Könnten Sie bitte ein bisschen mehr Informationen geben? Das klingt für mich wie ein Szenario in einer Multithread-Umgebung, habe ich recht? Meinst du in deiner Frage, dass es nach den einzelnen Schreibvorgängen nur einen einzigen sequentiellen Schreibvorgang in der Datei geben sollte? – Kosi2801

+0

@ Kosi2801: Ja, es gibt einen einzigen sequentiellen Schreibvorgang. Alle Schreiboperationen, die unterschiedliche HANDLE verwenden, sind verschachtelt. – Kim

Antwort

1

Sie sollten in der Lage sein, asynchrone überlappende IO durchzuführen.

Um Sie zu starten, sehen Sie sich den win32-API-Aufruf WriteFile an. Es wird erläutert, wie CreateFile mit dem Flag FLAG_FILE_OVERLAPPED verwandt wird. Anschließend rufen Sie WriteFile auf und übergeben einen OVERLAPPED-Parameter, der den Offset zum Starten des Schreibens enthält, und einen Ereignishandle, der nach Abschluss des IO signalisiert wird.

Alternativ können Sie auch WriteFileEx aufrufen, die eine Funktion aufruft, die Sie bei Abschluss des IO bereitstellen, anstatt ein Ereignis zu signalisieren.

Beachten Sie, dass Sie in Blöcken von 4K (4096) Bytes statt in Blöcken von 100 Bytes schreiben sollten, da dies die Größe der Seitendateien in Windows ist; es wird Ihr IO erheblich beschleunigen. Beachten Sie auch, dass dies nur ein Dateihandle und nicht mehrere erfordern sollte.

+0

Sie müssen auch etwas über das Abbrechen und die Ausnahmebehandlung nachdenken, was bei asynchronen E/A-Operationen ziemlich haarig werden kann, da Sie alle ausstehenden Operationen verfolgen müssen, um die Vorgänge ordnungsgemäß zu beenden. Schade, dass Sie dies nicht in F # schreiben können ... es macht diese Art von Code Drop-Dead einfach, da Async-Code mit Callbacks in einem linearen Stil geschrieben ist, und Dinge wie Ausnahmebehandlung und Cancel anhängig sind Bibliothek. –

+0

Natürlich, wenn Sie nicht in 4K-Blöcke schreiben können, dann memcpy'ing an der entsprechenden Stelle in einem Speicherpuffer und dann async schreiben den ganzen Block in einer one'r ist der Weg nach vorne. – Goz