2013-02-07 28 views
6

Windowsで同時に書き込みと読み取りを行うファイルを開こうとしています。 私は、ファイルに書き込むプログラム(1秒おきに1つ)とそこから読み取るプログラムを持っています。 Unixでは完全に動作しますが、Windowsでは動作しません(すでに開いているファイルを開くことはできません)。 私はfopen()でファイルを開きます。(Windows)同じファイルを同時に開く

どうすればこの問題を解決できますか?

EDIT2:

FILE *を使用_fsopenをチェックし、それに応じて共有フラグを設定します。

EDIT:すべての

まず、いくつかのコード:これは私が

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

読み取りが他のapplicaitonにあったファイルを開くために使用されるが、それは代わりにfscanfをしたかです。

固定コード:

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

おそらくこれが役立ちます:http://stackoverflow.com/questions/11566930/can-i-allow-multiple-programs-to-read-from-the-same-file-at-the-same-time – Nim

+0

Unix上で動作する単純な例(ちょうどオープンとスリープのような)を追加するかもしれないので、誰かが同じことをするWinコードをやる方が簡単です。 – hyde

+2

コードを表示してください。 VS 2008からVS 2012へのクイックテストは、 'fopen()'を使ってファイルを同時に開いたり( 'fopen()'が 'FILE_SHARE_READ | FILE_SHARE_WRITE'アクセスを使用すること)、問題はないことを示しています。 –

答えて

3

WindowsとLinuxの両方がデフォルトで使用fopenファイルを開くのデフォルトの方法があります。

Windowsでは、ブロックすることを意味します(一度に1つのプロセスだけがファイルを開くことができます)。

Linuxでは、ノンブロッキングを意味します。

fopenは、高度なAPIです。ファイルのブロックポリシーを選択するには、Windowsの場合WinAPIのOpenFileを使用する必要があります。特に、OF_SHARE_*フラグを見てください。

+4

この回答は正しくありません - Windows上の 'fopen()'は共有が許可されたファイルを開きます。 –

+0

@MichaelBurr:そうです、私は固定コードを添付しました。 –

+0

OpenFileではCreateFileで置き換えられた古くなった関数はありませんでしたか? – Joey

関連する問題