在对某些源代码进行性能分析时,我注意到 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/