2013-02-07 10 views
6

Ich versuche, eine Datei zum Schreiben und Lesen gleichzeitig in Windows zu öffnen. Ich habe ein Programm, das (jede Sekunde) in die Datei schreibt und eines, das davon liest. In Unix funktioniert es perfekt, aber es funktioniert nicht in Windows (Ich kann eine bereits geöffnete Datei nicht öffnen). Ich öffne die Datei mit fopen().(Windows) Öffnen Sie die gleiche Datei gleichzeitig

Wie kann ich dieses Problem lösen?

EDIT2:

Check-out _fsopen es verwendet FILE *, und der Anteil Flagge entsprechend gesetzt.

EDIT:

Zunächst einmal einige Code: Das ist, wie ich verwenden, um die Datei zu öffnen

FILE* f = NULL; 
     int res = fopen_s(&f, "c:\\temp\\File1.txt", "w"); 
     if (res != 0) return; 

     while (true) { 
      Sleep(1000); 
      fprintf_s(f , "Some data"); 
     } 
     fclose(f); 

Die Lese in anderer applicaiton war, aber es tat fscanf statt.

Der feste Code:

char d[] = "data"; 


HANDLE h = CreateFile("c:\\temp\\f.txt", GENERIC_READ | GENERIC_WRITE, 
    FILE_SHARE_WRITE | FILE_SHARE_READ, NULL, CREATE_ALWAYS, /*FILE_ATTRIBUTE_NORMAL*/ FILE_FLAG_WRITE_THROUGH, NULL); 

if (h == INVALID_HANDLE_VALUE) return 0; 

DWORD bytesW; 
while(true) { 
    Sleep(100); 
     WriteFile(h, d, strlen(d), &bytesW, NULL); 
} 

CloseHandle(h); 
return 0; 
+1

Vielleicht wird dies helfen: http://StackOverflow.com/Questions/11566930/Can-Iallow-Multiple-Programs-ToRead-from-the-Same-File-at-the-Same-time – Nim

+0

Vielleicht fügen Sie ein einfaches Beispiel (wie nur Open und Sleep) Programme hinzu, die mit Unix arbeiten, also ist es dann einfacher für jemanden, Win-Code zu machen, der dasselbe tut. – hyde

+2

Bitte Code anzeigen. Ein kurzer Test auf VS 2008 bis VS 2012 zeigt, dass es kein Problem gibt, 'fopen()' zu verwenden, um gleichzeitig eine Datei zum Schreiben und Lesen zu öffnen ('fopen()' verwendet 'FILE_SHARE_READ | FILE_SHARE_WRITE' Zugriff). –

Antwort

3

Windows und Linux haben eine Standard Möglichkeit, eine Datei zu öffnen, die fopen standardmäßig verwendet.

In Windows bedeutet das Blockieren (nur ein Prozess kann eine Datei gleichzeitig öffnen).

In Linux bedeutet es nicht blockierend.

fopen ist eine High-Level-API. Um die Blockierungsrichtlinie für die Datei selbst zu wählen, sollten Sie für Windows OpenFile von WinAPI verwenden. Schauen Sie sich insbesondere die OF_SHARE_* Flags an.

+4

Diese Antwort ist nicht korrekt - 'fopen()' unter Windows öffnet die Datei mit Freigabe erlaubt. –

+0

@MichaelBurr: Du hast Recht, ich habe den festen Code angehängt. –

+0

War nicht OpenFile die alte Funktion, die von CreateFile ersetzt wurde? – Joey

Verwandte Themen