Ruby:如何获取文件锁以进行写入?

标签 ruby file filelock

我想要实现的是:

  1. 如果其他进程持有锁,则退出
  2. 否则获取写入锁

我尝试修改的 Ruby 代码是。

File.open(filename, "wb") { |inf|
  if inf.flock(File::LOCK_EX|File::LOCK_NB) == 0
    ...
  end
}

我能找到的代码通常使用“rb”。如果我更改为 "wb" ,则会出现问题:因为如果其他进程正在处理该文件(在尝试锁定之前我无法知道),该文件将被 删除>File.open(..., "wb").

有办法吗?谢谢。

新信息

我认为一种方法是使用“File::RDWR|File::CREAT”,这样你可以先打开文件并且它不会删除其内容,然后尝试锁定。不确定是否还有其他方法,但 "wb" 可能行不通。我想这是 Ruby 的一个尴尬之处:在获取锁之前必须先打开文件。我认为这两个步骤应该是原子的。

最佳答案

创建一个锁定文件并锁定它。如果您的文件名是“path/to/file.txt”,则在“path/to/file.txt.lock”上创建一个锁。一旦您获得了对锁定文件的锁定,就可以像平常一样编辑真实文件。

关于Ruby:如何获取文件锁以进行写入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27306323/

相关文章:

git - 如何从 Git 存储库中提取任何提交到文件夹/存档的所有文件?

email - 释放 send-mailmessage 出错时留下的文件锁

c# - 释放文件锁时收到通知

perl - 我的 Linux 守护进程如何知道 Windows 程序何时停止写入我通过 SAMBA 访问的文件?

ruby-on-rails - 在运行时查找 ActiveRecord 类的关联?

ruby - 无法通过 RSpec 测试。时间不能强制进入 Fixnum

c# - File.WriteAllLines 静默失败

c - 从文件 fgetc 读取的性能与 fread 整个字符串的性能

ruby - Ruby 中奇怪的闭包行为

ruby-on-rails - 使用 Rails 进行功能测试时在多个表中创建记录的问题