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