编辑共享文件夹的修改文件由两个处理器在不同的计算机C#中编辑

时间:2014-07-31 11:13:17

标签: c# .net

我有两个相同的进程在两台不同的计算机上运行,​​这些计算机正在访问第三台计算机中的共享文件夹。此共享文件夹具有目录。因此,如何确保这两个处理器不访问并开始处理同一文件夹。换句话说,如果一个已经在其上工作的人跳过那个目录。

我尝试使用File.Create()方法在目录上创建临时文件 MSDN声明

  

此方法创建的FileStream对象具有默认的FileShare   无价值;没有其他进程或代码可以访问创建的文件   直到原始文件句柄关闭。

所以我的逻辑是如果临时文件已经存在,或者在尝试创建它时抛出异常,则跳过该目录。

不幸的是,这似乎不起作用。所以我的问题是

  1. 即使在文件中创建了文件,MSDN所说的也是如此 由运行在不同计算机上的处理器共享文件夹或是它 仅对本地驱动器有效

  2. 实现我想要做的事情的方法

3 个答案:

答案 0 :(得分:2)

您最好的选择是创建 true 临时文件。

在目录处理中使用此代码:

public void ProcessDirectory(string path)
{
    using (var lockFile = File.Create(Path.Combine(path, "process.lock"), 256, FileOptions.DeleteOnClose))
    {
        // process the directory here
    }
}

注意那里的FileOptions.DeleteOnClose。即使您的进程在此处异常终止,文件系统也会在您关闭文件时为您删除该文件。在异常终止的情况下,文件被关闭作为进程拆除的一部分。在硬电源故障的情况下,文件可能会被遗忘。

请注意,如果此方法已经锁定,此方法将抛出IOException,您需要处理此问题并继续。

答案 1 :(得分:1)

你的想法是正确的,也许你在实施中犯了错误?

这是工作代码

private const string _lockFileName = @"c:\whatever\lock";
private FileStream _lockFile;

public bool Lock()
{
    try
    {
        _lockFile = File.Open(_lockFileName, FileMode.Create, FileAccess.ReadWrite, FileShare.None);
        return true;
    }
    catch { } // perhaps a certain exception type?
    return false;
}

public void Unlock()
{
    if(_lockFile != null)
    {
        _lockFile.Close();
        File.Delete(_lockFileName);
        _lockFile = null;
    }
}

使用文件夹调用Lock()开始时,仅在文件夹返回true时才使用该文件夹。在结束通话Unlock()时,即使Lock()返回false,也可安全致电。

答案 2 :(得分:0)

开始处理时,可以在目录中编写lock.conf文件。然后,在完成后删除文件(释放锁定)。

两个考虑因素:

  1. 在锁定文件上设置时间戳,以便在预定的时间间隔后可以忽略锁定(为了避免在程序崩溃时保持锁定)
  2. 如果文件已存在,请使用在创建文件时引发异常的函数,以避免竞争条件。