2010-04-23 70 views
5

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

编辑:值得一提的是,如果你想将文件从一个网络共享移动到另一个网络共享而锁定到位,这个工程。该问题似乎只发生在文件共享同时锁定时移动文件。

+0

检查您是否有权限的共享文件夹的写。 – Nayan 2010-04-23 10:20:09

+0

权限已被检查,并没有问题。活跃用户对目录和共享拥有完全控制权共享 – MattH 2010-04-23 10:41:42

+0

什么样的操作系统提供共享? – 2010-04-23 11:51:46

回答

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

+0

谢谢Brian。这似乎是一个有效的总结,并解释了我所看到的。 – MattH 2011-07-21 08:23:58