Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/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 如何在Windows中关闭句柄后读取文件?_Winapi_Dropbox - Fatal编程技术网

Winapi 如何在Windows中关闭句柄后读取文件?

Winapi 如何在Windows中关闭句柄后读取文件?,winapi,dropbox,Winapi,Dropbox,我需要在Windows中读取文件,并避免任何操作系统级别的锁定,以便用户可以在我的应用程序读取文件时删除该文件 使用C++、Python、java等典型的读操作,通过PROMON:评估WiAPI调用的相同期望序列 创建文件 多次读取文件,直到到达文件末尾 关闭文件 如果我尝试在CreateFile之后和CloseFile之前的步骤1和步骤3之间通过资源管理器删除文件,我将得到一个使用中的文件错误 但是,我注意到,当Dropbox读取要上载到服务器的文件时,顺序是: 创建文件 关闭文件 读取文件

我需要在Windows中读取文件,并避免任何操作系统级别的锁定,以便用户可以在我的应用程序读取文件时删除该文件

使用C++、Python、java等典型的读操作,通过PROMON:

评估WiAPI调用的相同期望序列 创建文件 多次读取文件,直到到达文件末尾 关闭文件 如果我尝试在CreateFile之后和CloseFile之前的步骤1和步骤3之间通过资源管理器删除文件,我将得到一个使用中的文件错误

但是,我注意到,当Dropbox读取要上载到服务器的文件时,顺序是:

创建文件 关闭文件 读取文件 重复步骤1-3 由于ReadFile是在CloseFile之后调用的,所以即使Dropbox正在读取该文件,我仍然可以删除该文件

我无法理解Winapi在调用CloseFile后如何允许ReadFile

我附上了一个显示Dropbox行为的Procmon截图

有人知道这是怎么做到的吗


这种create close read语义应该是由文件映射到应用程序地址空间中的内存区域这一事实引起的。当应用程序尝试从该区域读取数据时,操作系统将从文件中读取必要的数据,并将其传递给应用程序。数据将显示在文件映射的内存区域中


内存映射文件由一个文件映射对象支持,该对象在内核世界中称为节。给定一个文件句柄,您可以通过CreateFileMapping创建这样一个对象,并通过MapViewOfFile将其映射到您的地址空间。某些Ex变体也存在。文件映射对象保留对其映射的文件的额外引用。因此,在为文件创建文件映射对象后,可以关闭文件句柄并通过文件映射对象读取文件。

多次调用CreateFile是有效的,只需对它们进行计数即可。在CreateFile上向上计数,在CloseHandle上向下计数。读取之后的CloseHandle是真正销毁最后一个句柄并与屏幕截图中的第一个CreateFile配对的句柄。所以你的假设是无效的。:你是对的。。。我觉得自己很笨。谢谢@HansPassant:您可以在文件上使用oplock oplock,比如FSCTL_REQUEST_oplock for be notify当oplock被破坏时,关闭文件句柄-读取更多-@RemyLebeau-文件将不会被实际删除,直到您不关闭它的句柄,并且读取不会返回错误,即使在对文件进行其他调用删除之后