22

我们正在尝试将文件从服务器复制到 .NET 2.0 应用程序 (C#) 中的本地计算机,但一直不必要地锁定源文件。我们怀疑是文件服务器上配置的东西导致了这种行为,但不确定是什么......你能帮忙吗?

文件复制操作后,文件服务器 (Windows 2K3 R2) 报告源文件正被读取锁定,即使服务器上的文件没有进一步操作。一旦应用程序退出,锁就会被释放。

即使使用下面看到的最基本的代码,我们也能够重现该行为:

static void Main(string[] args)
{
    string sourceFile = @"\\win2K3server\resource\Production\IQE\sourceFolder\iqeconsole.exe";
    string destinationFile = @"d:\destinationFolder\iqeconsole.exe";
    System.IO.File.Copy(sourceFile,destinationFile,true);

    Console.ReadLine();
}

锁定File.Copy()在行执行期间立即发生,并在该行完成后持续存在。在更复杂的应用程序中,当带有File.Copy()退出的例程(但应用程序仍在运行)时,锁仍然存在。

只有当整个应用程序完成时,锁才会被释放。

更改sourceFile为使用映射驱动器而不是 UNC 路径对行为没有影响。

当源文件位于另一台服务器上或位于本地时,不会发生此行为。

如果我们在后面加上下面一行File.Copy,锁会立即被释放:

new System.Security.Permissions.FileIOPermission(System.Security.Permissions.FileIOPermissionAccess.Read, new string[] { sourceFile }).Demand();

这对我们来说听起来好像服务器上有什么东西导致了这种行为。我们在服务器上安装了 ShadowProtect 以及 McAfee 防病毒软件。除此之外,似乎在 Windows Server 及其组件之上没有安装其他任何东西。

我们也不确定为什么要求文件的读取权限可以解决问题。

如果您能回答这些问题,我们将不胜感激:

  1. 是什么导致文件锁持续存在?
  2. 为什么要求读取权限可以解决问题?
4

2 回答 2

4

持有锁的可能是 McAfee 按访问扫描程序。如果您只使用读取访问权限,则会绕过它。我相信您可以使用 Sysinternals Process Viewer 工具(Microsoft 免费提供)来确认这一点。

不确定您有哪些 McAfee 订阅,但您可以定义例外规则,使其不扫描此文件。

于 2009-03-02T19:05:21.280 回答
0

我无法在我们的文件服务器上复制它。

但是,我知道机会锁定已禁用,因为我们使用的是 PeerSoftware 的 PeerLock。

于 2009-03-02T19:23:33.063 回答