Windows文件共享:为什么有时新创build的文件在一段时间内不可见?

请注意,我从这个复制这个问题,因为了解,ServerFault是这样的问题更好的地方( https://stackoverflow.com/questions/5159220 )

你好

我们面对非常奇怪的问题,使我们疯了。 有时我们的文件共享PC上新创build的文件在一段时间内“缺席”。 重现一个问题,你至less应该有两台电脑,称之为alphabeta 。 在beta PC上创build文件共享( \\beta\share\bug )并从alpha PC运行这个PowerShell脚本:

 param( $sharePath="\\beta\share\bug" ) $sharePC = ($sharePath -split '\\')[2] $session = New-PSSession -ComputerName $sharePC $counter = 0 while ($true) { $fileName = $sharePath + "\$counter.txt" Invoke-Command -Session $session -ScriptBlock { param( $fileName ) "" > $fileName } -ArgumentList $fileName if (Test-Path $fileName) { Write-Host "File $fileName exists" -fore Green } else { Write-Host "!!! File $fileName does NOT exist!" -fore Red } $counter = $counter + 1 Start-Sleep 2 } 

启动这个脚本后,你应该可以看到这些消息:

 File \\beta\share\bug\1.txt exists File \\beta\share\bug\2.txt exists ... 

现在 :打开cmd.exe并运行以下命令:

if exist \\beta\share\bug\foo.txt echo 1

在此之后,您将在大约10秒钟后看到以下消息:

 !!! File \\beta\share\bug\3.txt does NOT exist! !!! File \\beta\share\bug\4.txt does NOT exist! 

我们发现这个错误是由枚举创build新文件的共享目录引起的。 在Python调用os.listdir('//beta/share/bug')来重现一个bug。 在C#Directory.GetDirectories(@"\\beta\share\bug") 。 你甚至可以简单地导航到shell共享目录,并调用lsdir

Windows Server 2008 R2上发现了错误。 Bug也可以在Windows 7上重现(在两个操作系统上都安装了SMB 2.0

请注意,您不能在Windows资源pipe理器中实时查看alpha PC上的目录内容,因为如果您在资源pipe理器中打开此目录,则不会发生错误! 因此,确保在尝试重现错误之前closures所有这些窗口。 每个脚本重新启动后,你应该手动删除所有已经创build的共享文件(因为脚本是相当愚蠢的,总是从0.txt开始)。

我们目前对这个问题有两个解决方法:

  1. 如果客户端看到这种情况,它会在有问题的目录中创build一些临时文件 – 在这个文件奇迹般地出现之后。
  2. 禁用SMB 2.0: http : //www.petri.co.il/how-to-disable-smb-2-on-windows-vista-or-server-2008.htm

有没有人发现类似的问题,可以解释为什么会发生,以及如何“正确地解决”?

谢谢

我们目前的解决scheme正常工作:禁用SMB 2.0( http://www.petri.co.il/how-to-disable-smb-2-on-windows-vista-or-server-2008.htm

如果您不想降级smb服务的性能,请在您的smb客户端上修改以下registry设置。

 HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Lanmanworkstation\Parameters 

DirectoryCacheLifetimeFileNotFoundCacheLifetimeFileInfoCacheLifetime为0。

修复在这里和这里概述。