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

标签 .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();
}

锁定在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及其组件上方似乎没有安装其他任何东西。

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

如果您能回答这些问题,我们将不胜感激:
  • 是什么导致文件锁持续存在?
  • 为什么需要读取权限才能解决问题?
  • 最佳答案

    持有锁的可能是McAfee读写扫描器。如果仅使用读取访问,则会绕过该访问。我相信您可以使用Sysinternals Process Viewer工具(Microsoft免费提供)进行确认。

    不确定您拥有McAfee的订阅,但是可以定义异常(exception)规则,以便它不会扫描此文件。

    关于.net - File.Copy在完成后锁定源文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/603444/

    相关文章:

    c# - 在 WCF 客户端中查找流对象的长度?

    vba - 删除连续的重复项 : "File sharing lock count exceeded" at 9k of 1m records

    java - 如何在java中为属性文件提供文件锁?

    c# - 有条件地阻止方法覆盖

    .net - 是否需要 "close".net 配置

    c# - AsyncTaskMethodBuilder AwaitUnsafeOnCompleted 与等待时的 AwaitOnCompleted

    c - 在linux lockf、flock和fcntl下用C语言锁定文件是什么意思?

    c# - view, presenter 和 interface 之间的依赖关系

    php - 如何针对外部进程锁定文件

    php flock 和 fread 和 fwrite