2013-02-07 15 views
6

Próbuję otworzyć plik do jednoczesnego pisania i czytania w oknach. Mam jeden program, który zapisuje (co jedną sekundę) do pliku i czyta z niego. W systemie Unix działa idealnie, ale nie działa w oknach (nie mogę otworzyć już otwartego pliku). Otwieram plik za pomocą fopen().(Windows) Otwórz ten sam plik jednocześnie

Jak mogę rozwiązać ten problem?

EDIT2:

Wyjazd _fsopen używa FILE * i ustaw flagę zakładowego odpowiednio.

EDIT:

Przede wszystkim jakiś kod: to jest jak kiedyś otworzyć plik

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

Odczyt był w drugiej applicaiton, ale to nie fscanf zamiast.

Stała Kod:

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

Może to pomoże: http://stackoverflow.com/questions/11566930/can-i-allow-multiple-programs-to-read-from-the-same-file-at-the-same-time – Nim

+0

Może dodać prosty przykład (jak po prostu otwórz i śpij) programy działające na Uniksie, więc łatwiej jest komuś zrobić kod Win tak samo. – hyde

+2

Proszę pokazać kod. Szybki test na VS 2008 do VS 2012 wskazuje, że nie ma problemu z użyciem 'fopen()' do otwarcia pliku do zapisu i odczytu w tym samym czasie ('fopen()' używa dostępu 'FILE_SHARE_READ | FILE_SHARE_WRITE'. –

Odpowiedz

3

Zarówno Windows i Linux mają domyślny sposób otwierania pliku, który fopen używa domyślnie.

W systemie Windows oznacza to blokowanie (tylko jeden proces może otworzyć plik na raz).

W systemie Linux oznacza to, że nie blokuje się.

fopen to interfejs API wysokiego poziomu. Aby wybrać politykę blokowania pliku, w systemie Windows powinieneś użyć OpenFile z WinAPI. W szczególności spójrz na flagi OF_SHARE_*.

+4

Ta odpowiedź jest nieprawidłowa - "fopen()" w systemie Windows otwiera plik z dozwolonym udostępnieniem. –

+0

@MichaelBurr: Masz rację, załączyłem ustalony kod. –

+0

Czy OpenFile nie była starą funkcją, która została zastąpiona przez CreateFile? – Joey

Powiązane problemy