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

自动锁定多个文件

  •  1
  • dlras2  · 技术社区  · 14 年前

    .lock 目录中的文件(我只受保护,不受 我的

    我正在写我自己的bug追踪器(主要是作为一个练习,我知道我可以找到很好的解决方案),它将bug存储在网络上的文件中。我想象它有点像SVN—一个目录被程序接管,用来保存bug、修订、截图等,所有这些都由跟踪器管理。我假设SVN有一种方法可以确保多个客户机不会在同一时间进行提交,等等。

    5 回复  |  直到 14 年前
        1
  •  1
  •   Ray Henry    14 年前

    以独占方式打开每个文件,如果发现无法打开的文件,请解锁已锁定的文件。始终按字母顺序锁定以避免死锁。

        private List<FileStream> OpenExclusive(List<string> filenames)
        {
            var streams = new List<FileStream>(filenames.Count);
    
            try
            {
                filenames.Sort();
                foreach (var name in filenames)
                {
                    streams.Add(File.Open(name, 
                      FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None));
                }
                return streams;
            }
            catch (Exception)
            {
                CloseAll(streams);
                return null;
            }
        }
    
        private void CloseAll(List<FileStream> streams)
        {
            if (streams == null) return;
            foreach (var stream in streams)
            {
                stream.Close();
            }
        }
    
        2
  •  0
  •   Andrey    14 年前

    我推荐 Mutex

        3
  •  0
  •   Steven Sudit    14 年前

    如果以独占访问方式打开文件,它将保持锁定状态,其他试图打开它的人将失败。

        4
  •  0
  •   jthg    14 年前

    一个缺点是,如果应用程序实例无法重新命名目录,其他实例将被永远锁定。您可能会想出一些方案,其中重命名的目录名对重命名的时间进行编码。如果其他实例看到超时时间已过,则可以控制它。

    你有没有研究过现有的库,这样你就不必拿出自己的解决方案来处理所有的边缘案例?不幸的是,我不知道有什么不对劲的事。

        5
  •  0
  •   ChrisW    14 年前

    我希望多个用户提交从不同的地方在网络上的错误。

    使用数据库引擎。

    也许你是对的,但是我很好奇SVN是怎么工作的。在我看来,这里没有服务器,所有的客户端只是访问SVN目录中的标准文件结构。

    http://www.pushok.com/soft_svn_vscvs.php 说SVN是基于 BerkleyDB