我们正在尝试将文件从服务器复制到.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及其组件之上。
我们也不确定为什么要求对文件的读取权限可以解决问题。
如果你能回答这些问题,我们将非常感激:
答案 0 :(得分:4)
可能是McAfee on-access扫描程序持有锁。如果您只使用读访问权限,则会被绕过。我相信您可以使用Sysinternals Process Viewer工具(免费从Microsoft)来确认。
不确定您对McAfee有哪些订阅,但您可以定义例外规则,以便它不会扫描此文件。
答案 1 :(得分:0)
我无法在文件服务器上复制此内容。
但是,我知道机会锁定被禁用,因为我们正在使用PeerSoftware的PeerLock。