我一直在尝试锁定文件,以便其他克隆服务无法访问该文件。然后,我读取文件,然后在完成后移动文件。通过使用 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);
}

编辑:值得一提的是,如果您希望将文件从一个网络共享移动到锁定时的另一个网络共享,则可以使用。该问题仅在移动文件中时才发生 相同 文件共享在锁定时。

有帮助吗?

解决方案

我相信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:如果尝试在远程计算机上打开文件或目录在远程计算机上打开文件或目录,则会发生共享违规行为其他访问标志,尚未使用file_share_delete打开远程文件或目录。为避免在这种情况下的共享违规行为,请仅使用删除访问权利打开远程文件或目录,或在不先打开文件或目录的情况下致电DeleteFile以进行删除。

据此,您必须将删除作为fileaccess参数传递给io.file.open()。不幸的是,删除枚举未作为选项包括。

此问题仅与Windows 2003和更早有关。我已经在Windows 2008 R2 SP1上测试了您的代码,并且效果很好。因此,它也有可能也可以在Windows 2008上使用。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top