2013-02-07 15 views
6

Sto provando ad aprire un file per scrivere e leggere contemporaneamente, in Windows. Ho un programma che scrive (ogni secondo) nel file e uno che legge da esso. In Unix funziona perfettamente ma non funziona in Windows (non riesco ad aprire un file già aperto). Apro il file con fopen().(Windows) Apre lo stesso file contemporaneamente

Come posso risolvere questo problema?

EDIT2:

check out _fsopen usa FILE *, e impostare il flag di condivisione di conseguenza.

EDIT:

Prima di tutto, un po 'di codice: questo è il modo che ho usato per aprire il file

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); 

Il letto è stato in altri applicaiton, ma lo ha fatto fscanf invece.

Il codice fisso:

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

Forse questo aiuterà: http://stackoverflow.com/questions/11566930/can-i-allow-multiple-programs-to-read-from-the-same-file-at-the-same-time – Nim

+0

Magari aggiungi semplici esempi (come i programmi open e sleep) che funzionano su unix, quindi è più facile per qualcuno fare il codice Win facendo lo stesso. – hyde

+2

Si prega di mostrare il codice. Un rapido test su VS 2008 a VS 2012 indica che non c'è alcun problema con l'uso di 'fopen()' per aprire un file per scrivere e leggere contemporaneamente ('fopen()' usa l'accesso 'FILE_SHARE_READ | FILE_SHARE_WRITE'). –

risposta

3

sia Windows che Linux hanno un modo di default di aprire un file, che fopen utilizza di default.

In Windows, significa blocco (solo un processo può aprire un file alla volta).

In Linux, significa non bloccante.

fopen è un'API di alto livello. Per scegliere te stesso la politica di blocco sul file, per Windows dovresti usare OpenFile da WinAPI. In particolare, dai un'occhiata alle bandiere OF_SHARE_*.

+4

Questa risposta non è corretta - 'fopen()' su Windows apre il file con la condivisione consentita. –

+0

@ Michael Burr: hai ragione, ho allegato il codice fisso. –

+0

Non era OpenFile l'antica funzione che è stata sostituita da CreateFile? – Joey

Problemi correlati