(Windows)同时打开同一文件

时间:2013-02-07 17:16:32

标签: c++ c windows

我正试图在Windows中同时打开一个文件进行书写和阅读。 我有一个程序(每一秒)写入文件,一个程序从中读取。在unix中它完美地工作但它在Windows中不起作用(我无法打开已经打开的文件)。 我用fopen()打开文件。

我该如何解决这个问题?

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 个答案:

答案 0 :(得分:3)

Windows和Linux都有默认的打开文件的方式,fopen默认使用该文件。

在Windows中,这意味着阻止(一次只能打开一个文件)。

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

fopen是一个高级API。要选择自己的文件阻止策略,对于Windows,您应该使用WinAPI中的OpenFile。特别是,看一下OF_SHARE_*标志。