This page contains automated test results for code from O'Reilly's Ruby Cookbook. If this code looks interesting or useful, you might want to buy the whole book.

Changing the Permissions on a File
CodeExpectedActual
class File
  U_R = 0400
  U_W = 0200
  U_X = 0100
  G_R = 0040
  G_W = 0020
  G_X = 0010
  O_R = 0004
  O_W = 0002
  O_X = 0001
end
class File
  A_R = 0444
  A_W = 0222
  A_X = 0111
end
open("my_file", "w") {}
File.chmod(File::U_R | File::U_W | File::G_R | File::O_R, "my_file")
File.chmod(File::A_R | File::U_W, "my_file")
File.chmod(0644, "my_file")                   # Bitmap: 110001001 
File::U_R | File::U_W | File::G_R | File::O_R
420 420
File::A_R | File::U_W
420 420
0644
420 420
File.lstat("my_file").mode & 0777
420 420
new_permission = File.lstat("my_file").mode ^ File::O_R
File.chmod(new_permission, "my_file")
File.lstat("my_file").mode & 0777
416 416
new_permission = File.lstat("my_file").mode | File::A_R | File::A_W | File::A_X
File.chmod(new_permission, "my_file")
File.lstat("my_file").mode & 0777
511 511
new_permission = File.lstat("my_file").mode ^ (File::O_W | File::O_X)
File.chmod(new_permission, "my_file")
File.lstat("my_file").mode & 0777
508 508
class File
  def File.fancy_chmod(permission_string, file)
    mode = File.lstat(file).mode
    permission_string.scan(/[ugoa][+-=][rwx]+/) do |setting|
      who = setting[0..0]
      setting[2..setting.size].each_byte do |perm|
        perm = perm.chr.upcase
        mask = eval("File::#{who.upcase}_#{perm}")
      (setting[1] == ?+) ? mode |= mask : mode ^= mask
      end
    end
    File.chmod(mode, file)
  end
end
Give the owning user write access
File.fancy_chmod("u+w", "my_file")
File.lstat("my_file").mode & 0777
508 508
File.fancy_chmod("g-x", "my_file")
File.lstat("my_file").mode & 0777
500 500
File.fancy_chmod("a+rwx", "my_file")
File.lstat("my_file").mode & 0777
511 511
File.fancy_chmod("u+rwxo-x", "my_file")
File.lstat("my_file").mode & 0777
510 510