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

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

请注意,我从 SO 复制了这个问题,因为我知道 ServerFault 更适合解决此类问题(https://stackoverflow.com/questions/5159220

你好

我们遇到了一个非常奇怪的问题,让我们抓狂。有时,我们的文件共享 PC 上新创建的文件会在一段时间内“消失”。要重现问题,您至少应该有两台计算机,分别拨打它们alpha和。在PCbeta上创建文件共享()并从PC运行此 PowerShell 脚本:beta\\beta\share\bugalpha

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!

我们发现错误是由枚举正在创建新文件的共享目录引起的。在Python调用中os.listdir('//beta/share/bug')重现错误。在C#Directory.GetDirectories(@"\\beta\share\bug")。您甚至可以通过 shell 导航到共享目录并调用lsdir

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

请注意,您无法alpha在 Windows 资源管理器中实时查看 PC 上的目录内容,因为如果您在资源管理器中打开此目录,则不会发生错误!因此,请确保在尝试重现错误之前关闭所有此类窗口。每次重新启动脚本后,您都应手动从共享中删除所有已创建的文件(因为脚本相当愚蠢,并且总是从 0.txt 开始)。

目前,我们针对此问题有两种解决方法:

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

是否有人发现过类似的问题并能解释它为什么会发生以及如何“正确修复”它?

谢谢

答案1

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

答案2

如果您不想降低 smb 服务的性能,请修改 smb 客户端上的以下注册表设置。

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Lanmanworkstation\Parameters

将 和DirectoryCacheLifetime设置为0。FileNotFoundCacheLifetimeFileInfoCacheLifetime

修复概述这里这里

相关内容