2009-03-02 174 views
21

我们正试图将文件从一台服务器在.NET 2.0的应用程序(C#)复制下来,到本地计算机,但保持其不必要地锁止源文件后,源文件。我们怀疑它是在文件服务器上配置的导致此行为的东西,但不确定...你能帮忙吗?File.Copy锁定完成

文件复制操作后,文件服务器(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()行执行时立即occurrs,这行结束后仍然存在。在更复杂的应用程序中,当存在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. 为什么要求读取权限解决问题?
+0

更新:此问题不再可重现。它似乎已经解决了。我们无法确认迈克菲是否也造成了这个问题(但这可能与我们调查时解决问题有关)。 – Jayden 2009-03-18 21:59:34

+1

@Jarden:我和File.Copy有同样的问题。如果File.Copy()之后的下一个语句是Delete - 它报告访问异常。问题发生的不确定性,但上面的Demand()方法解决了这个问题。据我所见,这个问题是独立于防病毒软件的。 – PanJanek 2010-04-28 13:35:49

回答

4

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

不知道你有什么订购迈克菲,但你可以定义例外规则,以便它不会扫描该文件。

0

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

不过,我知道机会锁定,因为我们使用的是由PeerLock禁用PeerSoftware。