module FileHelper

Public Instance Methods

device?(file_name) click to toggle source
# File lib/filewatch/helper.rb, line 49
def device?(file_name)
  File.chardev?(file_name) || File.blockdev?(file_name)
end
rand_filename(prefix) click to toggle source
# File lib/filewatch/helper.rb, line 65
def rand_filename(prefix)
  [ prefix, Thread.current.object_id, Process.pid, rand(1000000) ].join('.')
end
write_atomically(file_name) { |temp_file| ... } click to toggle source

Write to a file atomically. Useful for situations where you don’t want other processes or threads to see half-written files.

File.write_atomically('important.file') do |file|
  file.write('hello')
end
# File lib/filewatch/helper.rb, line 15
def write_atomically(file_name)

  if File.exist?(file_name)
    # Get original file permissions
    old_stat = File.stat(file_name)
  else
    # If not possible, probe which are the default permissions in the
    # destination directory.
    old_stat = probe_stat_in(File.dirname(file_name))
  end

  mode = old_stat ? old_stat.mode : nil

  # Create temporary file with identical permissions
  temp_file = File.new(rand_filename(file_name), "w", mode)
  temp_file.binmode
  return_val = yield temp_file
  temp_file.close
  new_stat = File.stat(temp_file)

  # Overwrite original file with temp file
  File.rename(temp_file.path, file_name)

  # Unable to get permissions of the original file => return
  return return_val if old_stat.nil?

  # Set correct uid/gid on new file if ownership is different.
  if old_stat && (old_stat.gid != new_stat.gid || old_stat.uid != new_stat.uid)
    File.chown(old_stat.uid, old_stat.gid, file_name) if old_stat
  end

  return_val
end