2013-02-07 131 views
6

我試圖在windows中同時打開和讀取文件。 我有一個程序寫入(每一秒)的文件和一個讀取它。在Unix下它工作正常,但它不能在Windows中工作(我無法打開已打開的文件)。 我用fopen()打開文件。(Windows)同時打開同一個文件

我怎樣才能解決這個問題?

EDIT2:

退房_fsopen它使用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); 

讀是在其他應用程序了,但它確實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 2012對VS 2008進行快速測試表明,使用'fopen()'打開文件以便同時進行寫入和讀取('fopen()'使用'FILE_SHARE_READ | FILE_SHARE_WRITE'訪問)沒有問題。 –

回答

3

Windows和Linux有打開一個文件,其中fopen默認使用的默認方式。

在Windows中,這意味着阻塞(一次只能有一個進程可以打開文件)。

在Linux中,它意味着非阻塞。

fopen是一個高級API。要選擇文件上的阻止策略,對於Windows,您應該使用WinAPI中的OpenFile。特別是,看看OF_SHARE_*標誌。

+4

這個答案不正確 - Windows上的'fopen()'打開允許共享的文件。 –

+0

@MichaelBurr:你說得對,我附上了固定的代碼。 –

+0

是不是OpenFile是由CreateFile取代的古代功能? – Joey

相關問題