2012-07-19 10 views
8

Mam aplikację, która odczytuje zestaw plików danych i wykonuje niektóre obliczenia modelu. Program nie trzeba modyfikować dane same pliki, więc jestem obecnie otwierając je z flagą tylko do odczytu, jak pokazano poniżej:Czy mogę zezwolić wielu programom na odczyt z tego samego pliku w tym samym czasie?

FILE* file; 
if(_wfopen_s(&file, fname.c_str(), L"r") == 0) 
... 

Chciałbym mieć kilka wystąpień mojego programu uruchomione w tym samym czasie, używając tego samego zestawu danych, ale wykonując różne obliczenia na danych. Żaden z moich programów nie wymaga modyfikacji plików danych. Ponieważ pliki danych są bardzo duże, nie mogę tworzyć oddzielnych kopii danych do użycia z każdym programem.

Zakładam, że ponieważ otwieram pliki z uprawnieniami tylko do odczytu, dwa programy mogą jednocześnie czytać z tego samego pliku. Zamiast tego dostaję różne błędy wzdłuż linii "plik nie może być otwarty, ponieważ jest używany przez inny proces".

Ponieważ moim środowiskiem programistycznym jest Windows 7, this question suggests it might be a matter of enabling read sharing. Jednak wszystkie odpowiedzi w tym wątku opierają się na CreateFile, natomiast mam do czynienia ze starszym kodem, który został napisany przy pomocy stdio.h.

Czy istnieje sposób, że mogę mieć kilka programów jednocześnie czytanych z pliku przy użyciu klasy funkcji fopen?

+0

Myślę, że nie ma innego sposobu niż użycie CreateFile(). Pytanie brzmi, w jaki sposób można uzyskać PLIK * z UCHWYTU. – Paranaix

+1

możesz użyć std :: ifstream .. po tym wszystkim jest otagowany C++? – stijn

+0

@Paranaix: '_open_osfhandle', a następnie' _fdopen'. – MSalters

Odpowiedz

6

Jeśli możesz zmienić procedurę fopen, spróbuj zastąpić połączenia fopen z _fsopen, aby uzyskać wspólne czytanie/zapisywanie. _fsopen jest specyficzne dla mscrt.

Jeśli może używać CreateFile, i nie chce ponownie napisać cały kod starszego typu do odczytu/zapisu, można także spróbować kojarzenia FILE * z uchwytu pliku winapi. Użyj _open_osfhandle, aby uzyskać deskryptor pliku z uchwytu pliku zwróconego przez CreateFile, a następnie użyj _fdopen, aby uzyskać FILE * z tego deskryptora pliku.

Powiązane problemy