锁定行为因网络共享而异

时间:2010-04-23 09:58:58

标签: c# .net windows file-locking network-share

我一直在尝试锁定文件,以便其他克隆服务无法访问该文件。然后我读取文件,然后在完成后移动文件。使用FileShare.Delete允许移动。

然而,在后来的测试中,我们发现如果我们查看网络共享,这种方法不起作用。我感谢我的方法可能不是最好的,但我的具体问题是:

为什么以下演示针对本地文件而不是针对网络文件?

您越是具体越好,因为我在搜索中发现的信息非常少,表明网络共享的行为与本地磁盘不同。

string sourceFile = @"C:\TestFile.txt";
string localPath = @"C:\MyLocalFolder\TestFile.txt";
string networkPath = @"\\MyMachine\MyNetworkFolder\TestFile.txt";

File.WriteAllText(sourceFile, "Test data");

if (!File.Exists(localPath))
    File.Copy(sourceFile, localPath);

foreach (string path in new string[] { localPath, networkPath })
{
    using (FileStream fsLock = File.Open(path, FileMode.Open, FileAccess.ReadWrite, (FileShare.Read | FileShare.Delete)))
    {
        string target = path + ".out";
        File.Move(path, target); //This is the point of failure, when working with networkPath

        if (File.Exists(target))
            File.Delete(target);
    }

    if (!File.Exists(path))
        File.Copy(sourceFile, path);
}

编辑:值得一提的是,如果您希望在锁定到位时将文件从一个网络共享移动到另一个网络共享,则可以正常工作。仅当同一文件共享中的文件被锁定时,才会出现此问题。

1 个答案:

答案 0 :(得分:3)

我相信System.IO.File.Open()映射到Win32 API函数CreateFile()。在Microsoft的此函数文档[http://msdn.microsoft.com/en-us/library/aa363858(v=vs.85).aspx]中,它提到了以下内容:

  

Windows Server 2003和Windows XP / 2000:如果在dwDesiredAccess参数的值为DELETE访问标志(0x00010000)或''时尝试在远程计算机上打开文件或目录以进行删除,则会发生共享冲突使用任何其他访问标志编辑,并且尚未使用FILE_SHARE_DELETE打开远程文件或目录。要避免在此方案中发生共享冲突,请仅使用DELETE访问权限打开远程文件或目录,或者在不先打开要删除的文件或目录的情况下调用DeleteFile。

根据这一点,您必须将DELETE作为FileAccess参数传递给IO.File.Open()。不幸的是,DELETE枚举不作为选项包括在内。

此问题仅适用于Windows 2003及更早版本。我已经在Windows 2008 R2 SP1上测试了您的代码,它运行正常。所以它也有可能在Windows 2008上运行。