复制文件后源文件被锁定

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. 为什么要求读取权限可以解决问题?

更新:这个问题已经无法再现。它似乎已经解决了。我们也无法确认 McAfee 是否导致了这个问题(但这可能与我们调查时问题得到解决有关)。 - Jayden
1
@Jarden:我在使用File.Copy时遇到了同样的问题。如果在File.Copy()之后的下一条语句是Delete,它会报告访问异常。这个问题是不确定性的,但上面的Demand()方法解决了这个问题。据我所见,这个问题与防病毒软件无关。 - PanJanek
我有同样的问题,但绝对不是 McAfee 的问题,我正在运行 AVG,但已禁用文件监视器。我正在使用 Unlocker 告诉我哪个应用程序锁定了该文件,并且它也确认是我的应用程序。所以我想仍然存在争议!然而,实施您的解决方案解决了我的问题,所以我暂时很满意。 - Anthony Main
2个回答

4

很可能是McAfee实时扫描程序锁住了文件。如果你只需要读取文件,则可以绕过锁定。我认为,你可以使用Sysinternals进程查看器工具(Microsoft免费提供)来确认这一点。

不确定你为McAfee订阅了哪个版本,但你可以定义例外规则以便不扫描该文件。


您好。感谢您的反馈,我们目前正在调查此事。 - Jayden
仅供参考,我们无法通过进程查看器确认这是否是问题。问题似乎已经神秘地自行解决,尽管我们的服务器人员说他们没有对服务器进行任何操作!您的答案被评为“最佳”,因此我们授予了您积分。感谢您的帮助。 - Jayden
谢谢,但麦克菲仍然是一个不错的选择,因为我经常在复制文件后遇到这个问题。我需要关闭麦克菲的即时扫描器,然后才能删除该文件。 - cdonner

0

我无法在我们的文件服务器上复制这个问题。

然而,我知道由于我们正在使用PeerSoftware的PeerLock,机会式锁定已被禁用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接