Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Winapi:通过不同的句柄读写同一个文件是否需要刷新?_Winapi - Fatal编程技术网

Winapi:通过不同的句柄读写同一个文件是否需要刷新?

Winapi:通过不同的句柄读写同一个文件是否需要刷新?,winapi,Winapi,假设我已经打开了同一个文件的两个文件句柄(如果有必要的话,在同一个进程中)。在第一个句柄上执行写操作,在第二个句柄上执行读操作 hFile1 = CreateFile(path, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE,0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0); hFile2 = CreateFile(path, GENERIC_READ, FILE_SHAR

假设我已经打开了同一个文件的两个文件句柄(如果有必要的话,在同一个进程中)。在第一个句柄上执行写操作,在第二个句柄上执行读操作

hFile1 = CreateFile(path, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE,0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);

hFile2 = CreateFile(path, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);

SetFilePointerEx(hFile1, ...); // seek to write position
WriteFile(hFile1, ... );

// is any barrier or flusing needed here?

SetFilePointerEx(hFile2, ...); // seek to read position
ReadFile(hFile2, ... );
hFile2
上的读取是否总是立即“查看”先前在
hFile1
上执行的所有写入,或者是否需要刷新第一个句柄

这种行为有记录在案吗


使用
文件\u标志\u无缓冲时的行为是否相同?

您不需要任何屏障或冲洗。与
文件\u标志\u无缓冲区
相同。您不需要使用
SetFilePointerEx
-这是额外的调用。在
WriteFile
/
ReadFile
instead@RbMm:你的答案有参考资料吗?(我加入SetFilePointerEx只是为了清楚我在做随机访问)这只是基于我的内部知识。只有在以下情况下才需要刷新:您通过缓冲文件句柄写入数据,然后通过非缓冲句柄读取数据(使用
文件\u标志\u无缓冲
)。或者使用异步句柄(当写/读返回时,操作可能无法完成)。如果使用相同的缓冲方法(缓冲或非缓冲)和两个同步句柄,则不需要任何刷新或屏障。再次
SetFilePointerEx
-额外和垃圾call@RbMm谢谢如果访问是异步的,为了避免刷新,在开始读取之前完成写入是否足够?刷新-这是强制将数据从缓存写入磁盘。您只需要在以下情况下进行刷新:一个文件句柄不使用缓存(因此直接从磁盘读取),另一个文件句柄使用缓存(因此不仅要写入磁盘,还要首先写入缓存)。但是,如果两者都说使用缓冲区——它是一致的——根本不需要任何刷新。如果担心丢失写入数据(如果系统突然关闭),则需要刷新。关于异步-数据将是一致的-如果您在写入完成后开始读取。但writecomplete(在异步情况下)不仅在writefile返回之后完成,而且有些延迟。因此,在读取之前,您需要等待写入完成