我们试图将文件从服务器复制到.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/