通过networking共享locking行为是不同的

我一直在试图locking一个文件,以便其他克隆的服务不能访问该文件。 然后我读取文件,然后完成后移动文件。 移动是通过使用FileShare.Delete允许的。

但是在后来的testing中,我们发现如果我们正在查看networking共享,这种方法是行不通的。 我赞赏我的做法可能不是最好的,但我的具体问题是:

为什么下面的演示针对本地文件,而不是针对networking文件?

更具体的你可以是更好的,因为我发现我的search很less的信息,表明networking共享行为不同于本地磁盘。

 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); } 

编辑:值得一提的是,如果您希望将文件从一个networking共享移到另一个networking共享,同时locking就位,这是有效的。 这个问题似乎只发生在locking的同一个文件共享内文件。

Solutions Collecting From Web of "通过networking共享locking行为是不同的"

我相信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上运行。