我们正在尝试将文件从服务器复制到.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. 为什么要求读取权限才能解决问题?
有帮助吗?

解决方案

可能是McAfee on-access扫描程序持有锁。如果您只使用读访问权限,则会被绕过。我相信您可以使用Sysinternals Process Viewer工具(免费从Microsoft)来确认。

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

其他提示

我无法在文件服务器上复制此内容。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top