File.Copy在完成后锁定源文件

Jay*_*den 22 .net file-locking

我们正在尝试将文件从服务器复制到.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();
}
Run Code Online (Sandbox Code Playgroud)

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

只有当整个应用程序完成时才会释放锁定.

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

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

如果我们在之后添加以下行 File.Copy,则立即释放锁:

new System.Security.Permissions.FileIOPermission(System.Security.Permissions.FileIOPermissionAccess.Read, new string[] { sourceFile }).Demand();
Run Code Online (Sandbox Code Playgroud)

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

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

如果你能回答这些问题,我们将非常感激:

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

cdo*_*ner 4

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

不确定您的 McAfee 订阅是什么,但您可以定义例外规则,以便它不会扫描此文件。