windows - C++ CreateFile 和 fopen 函数抢先读取整个远程文件

标签 windows visual-c++ fopen createfile

在对某些源代码进行性能分析时,我注意到 CreateFile 和 fopen 都花费了异常长的时间来完成远程文件。

进一步深入研究 wireshark,我发现当使用这两个函数中的任何一个打开文件进行读取时,文件的全部内容(最多大约 4MB)都会被读取。我还要注意,在 SMB2 读取操作完成之前,这两个函数都不会返回(这占用了大约 99% 的已用调用时间)。

有什么办法可以防止这种行为吗?谁能解释这里发生了什么?

.. ..

例子:

HANDLE h = ::CreateFile( "\\\\Server1\\Data0\\CRUISE_DATA.bin", GENERIC_READ, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_READONLY, NULL );

来自 Wireshark:

SMB2 426 创建请求文件:Jim\Data0\CRUISE_DATA.bin

SMB2 386 创建响应文件:Jim\Data0\CRUISE_DATA.bin

SMB2 171 读取请求 Len:65536 Off:0 File:Jim\Data0\CRUISE_DATA.bin

SMB2 1434 读取响应

...

...

SMB2 171 读取请求 Len:65536 Off:3735552 文件:Jim\Data0\CRUISE_DATA.bin

SMB2 1434 读取响应

最佳答案

它肯定是在扫描某些东西……实际上是病毒扫描。一旦我关闭病毒扫描程序并重复测试,这种行为就消失了。显然,实时保护会扫描在给定进程中打开的每个文件。它至少可以做的是更新本地缓存;)

这个问题困扰了我们一段时间。它认为在我发布问题的第二天,答案就会落在我们手中。无论如何,我希望这对其他人有帮助。

关于windows - C++ CreateFile 和 fopen 函数抢先读取整个远程文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45153324/

相关文章:

c++ - MS VC++ 9 pcrecpp.lib 链接错误

c - 将文本文件中的数字列表读入二维数组

windows - FTP 客户端 Filezilla 和 Ftpuse 可以工作,但 Windows 资源管理器无法使用 PASV 模式

windows - C++ 信号量和 _popen 用法

c++ - 在编译时确定指针类型

汇编x86 "enter 0,0"的目的是什么

php file_get_contents() 在加载图像时卡住

c - fopen 未打开文件

windows - 为什么我的 DLL 好像没有被调用?

windows - Windows 上的应用模式文件对话框