我们正在尝试将文件从服务器复制到 .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 及其组件之上没有安装其他任何东西。
我们也不确定为什么要求文件的读取权限可以解决问题。
如果您能回答这些问题,我们将不胜感激:
- 是什么导致文件锁持续存在?
- 为什么要求读取权限可以解决问题?