File#closed?
その特定の File オブジェクトが閉じているかどうかを返すため、現在試行されているソリューションを機能させるメソッドはありません。
f1 = File.new("test.file")
f2 = File.new("test.file")
f1.close
f1.closed? # => true # Even though f2 still has the same file open
可能であれば、使用している File オブジェクトを保持して、閉じているかどうかを確認することをお勧めします。
現在の Ruby プロセスが特定のパスに対して開いている File オブジェクトを持っているかどうかを本当に知りたい場合は、次のようなものがハックのように感じますが、ほとんどの場合うまくいくはずです。
def file_is_closed?(file_name)
ObjectSpace.each_object(File) do |f|
if File.absolute_path(f) == File.absolute_path(file_name) && !f.closed?
return false
end
end
true
end
私はコーナーケースをうまく処理することを支持していませんが、一般的にはうまくいくようです:
f1 = File.new("test.file")
f2 = File.new("test.file")
file_is_closed?("test.file") # => false
f1.close
file_is_closed?("test.file") # => false
f2.close
file_is_closed?("test.file") # => true
プロセスがファイルを開いているかどうかを知りたい場合は、のような外部のものに頼る必要があると思いますlsof
。