代码之家  ›  专栏  ›  技术社区  ›  MattH

通过网络共享锁定行为不同

  •  5
  • MattH  · 技术社区  · 16 年前

    我一直试图锁定一个文件,以便其他克隆服务无法访问该文件。然后读取文件,完成后移动文件。通过使用允许移动 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 回复  |  直到 15 年前
        1
  •  3
  •   Brain2000    15 年前

    我相信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参数的值为“删除访问标志”(0x00010000)或“使用任何其他访问标志”以及远程文件或DI时,如果试图在远程计算机上打开要删除的文件或目录,则会发生共享冲突。目录没有用文件_share_delete打开。若要避免此方案中的共享冲突,请仅使用“删除”访问权限打开远程文件或目录,或者在不首先打开要删除的文件或目录的情况下调用“删除文件”。

    根据这一点,您必须将delete作为fileaccess参数传递给io.file.open()。遗憾的是,删除枚举没有作为选项包括在内。

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

    推荐文章