2016-09-22 148 views
0

有2点相似的配置:阅读文件

  1. 的Ubuntu 16.04服务器的共享文件夹中\\它的Linux \数据和文件test.txt(桑巴4.3.9-Ubuntu的)
  2. 的Windows Server 2012服务器的共享文件夹\\ WIN \数据和文件test.txt它

还有另一个PC(Win 7的)和C#测试程序,从任何的读取文件内容如上所述的循环设置如下:

  1. 读取文件时,请记住数据大小
  2. 等待500毫秒
  3. 再次
  4. 读文件,如果大小改变 - 打印出的大小与该文件末尾的内容几个字节一起,更新存储大小
  5. 转到2.

现在,当我运行测试与安装#1(赢股) - 如果我打开服务器上的文件,修改的内容并保存 - 我可以马上看到测试程序的反应 - 第一文件修改后的循环迭代为我带来了新的文件大小和新的数据。

但是当我运行与setup#2(ubuntu共享)相同的测试 - 我看不到修改过的大小或内容在测试程序中,直到有一段时间过去(并且这个时间取决于我用什么方法读取文件内容,FileStream约为10秒,File.ReadAllBytes约为30秒到10分钟)。

设置#2的一个有趣的注意事项 - 如果我在Ubuntu中修改文件,然后去测试PC(测试程序正在循环,尝试获取更新的文件内容)并用记事本打开共享文件 - 测试程序立即获取更新的内容。

对我来说,它看起来像测试机器上的客户端缓存。唯一我能想到的是,Win Server 2012使用SMB3和Ubuntu - SMB2_10,并以某种方式强制客户端(测试阅读器部分)以不同方式运行。

我没有Linux的专家,据我知道有没有办法能够在Ubuntu SMB3协议

所以,问题是如何强制客户端(也可以作为客户端SMB3而不是服务器工作)( Win 7)无论服务器类型和协议版本如何都无缓存地读取,或者如果不可能 - 如何用记事本模拟C#代码打开文件,这显然给它一个启示并迫使所有读者获得更新的内容。

回答

0

计算出在linux samba配置(smb.conf)中禁用机会锁(oplocks)的帮助。

使用OpLocks禁用的客户端计算机上的测试程序获取更新的内容而无需缓存。