锁定行为因网络共享而异

Mat*_*ttH 5 .net c# windows network-share file-locking

我一直在尝试锁定文件,以便其他克隆服务无法访问该文件.然后我读取文件,然后在完成后移动文件.使用Move是允许的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);
}
Run Code Online (Sandbox Code Playgroud)

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

Bra*_*000 3

我相信 System.IO.File.Open() 映射到 Win32 API 函数 CreateFile()。在微软关于此功能的文档中[ 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 上运行。