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.
| Backing Up to Versioned Filenames | ||
|---|---|---|
| Code | Expected | Actual |
class File
def File.versioned_filename(base, first_suffix='.0')
suffix = nil
filename = base
while File.exists?(filename)
suffix = (suffix ? suffix.succ : first_suffix)
filename = base + suffix
end
return filename
end
end
5.times do |i|
name = File.versioned_filename('filename.txt')
open(name, 'w') { |f| f << "Contents for run #{i}" }
puts "Created #{name}"
end |
Created filename.txt Created filename.txt.0 Created filename.txt.1 Created filename.txt.2 Created filename.txt.3 |
Created filename.txt Created filename.txt.0 Created filename.txt.1 Created filename.txt.2 Created filename.txt.3 |
require 'ftools'
class File
def File.to_backup(filename, move=false)
new_filename = nil
if File.exists? filename
new_filename = File.versioned_filename(filename)
File.send(move ? :move : :copy, filename, new_filename)
end
return new_filename
end
end
File.to_backup('filename.txt') |
"filename.txt.4" | "filename.txt.4" |
File.to_backup('filename.txt') |
"filename.txt.5" | "filename.txt.5" |
File.to_backup('filename.txt', true) |
"filename.txt.6" | "filename.txt.6" |
File.exists? 'filename.txt' |
false | false |
File.to_backup('filename.txt') |
nil | nil |
200.times do |i|
name = File.versioned_filename('many_versions.txt', '.000')
open(name, 'w') { |f| f << "Contents for run #{i}" }
puts "Created #{name}"
end |
Created many_versions.txt Created many_versions.txt.000 Created many_versions.txt.001 ... Created many_versions.txt.197 Created many_versions.txt.198 |
Created many_versions.txt Created many_versions.txt.000 Created many_versions.txt.001 Created many_versions.txt.002 Created many_versions.txt.003 Created many_versions.txt.004 Created many_versions.txt.005 Created many_versions.txt.006 Created many_versions.txt.007 Created many_versions.txt.008 Created many_versions.txt.009 Created many_versions.txt.010 Created many_versions.txt.011 Created many_versions.txt.012 Created many_versions.txt.013 Created many_versions.txt.014 Created many_versions.txt.015 Created many_versions.txt.016 Created many_versions.txt.017 Created many_versions.txt.018 Created many_versions.txt.019 Created many_versions.txt.020 Created many_versions.txt.021 Created many_versions.txt.022 Created many_versions.txt.023 Created many_versions.txt.024 Created many_versions.txt.025 Created many_versions.txt.026 Created many_versions.txt.027 Created many_versions.txt.028 Created many_versions.txt.029 Created many_versions.txt.030 Created many_versions.txt.031 Created many_versions.txt.032 Created many_versions.txt.033 Created many_versions.txt.034 Created many_versions.txt.035 Created many_versions.txt.036 Created many_versions.txt.037 Created many_versions.txt.038 Created many_versions.txt.039 Created many_versions.txt.040 Created many_versions.txt.041 Created many_versions.txt.042 Created many_versions.txt.043 Created many_versions.txt.044 Created many_versions.txt.045 Created many_versions.txt.046 Created many_versions.txt.047 Created many_versions.txt.048 Created many_versions.txt.049 Created many_versions.txt.050 Created many_versions.txt.051 Created many_versions.txt.052 Created many_versions.txt.053 Created many_versions.txt.054 Created many_versions.txt.055 Created many_versions.txt.056 Created many_versions.txt.057 Created many_versions.txt.058 Created many_versions.txt.059 Created many_versions.txt.060 Created many_versions.txt.061 Created many_versions.txt.062 Created many_versions.txt.063 Created many_versions.txt.064 Created many_versions.txt.065 Created many_versions.txt.066 Created many_versions.txt.067 Created many_versions.txt.068 Created many_versions.txt.069 Created many_versions.txt.070 Created many_versions.txt.071 Created many_versions.txt.072 Created many_versions.txt.073 Created many_versions.txt.074 Created many_versions.txt.075 Created many_versions.txt.076 Created many_versions.txt.077 Created many_versions.txt.078 Created many_versions.txt.079 Created many_versions.txt.080 Created many_versions.txt.081 Created many_versions.txt.082 Created many_versions.txt.083 Created many_versions.txt.084 Created many_versions.txt.085 Created many_versions.txt.086 Created many_versions.txt.087 Created many_versions.txt.088 Created many_versions.txt.089 Created many_versions.txt.090 Created many_versions.txt.091 Created many_versions.txt.092 Created many_versions.txt.093 Created many_versions.txt.094 Created many_versions.txt.095 Created many_versions.txt.096 Created many_versions.txt.097 Created many_versions.txt.098 Created many_versions.txt.099 Created many_versions.txt.100 Created many_versions.txt.101 Created many_versions.txt.102 Created many_versions.txt.103 Created many_versions.txt.104 Created many_versions.txt.105 Created many_versions.txt.106 Created many_versions.txt.107 Created many_versions.txt.108 Created many_versions.txt.109 Created many_versions.txt.110 Created many_versions.txt.111 Created many_versions.txt.112 Created many_versions.txt.113 Created many_versions.txt.114 Created many_versions.txt.115 Created many_versions.txt.116 Created many_versions.txt.117 Created many_versions.txt.118 Created many_versions.txt.119 Created many_versions.txt.120 Created many_versions.txt.121 Created many_versions.txt.122 Created many_versions.txt.123 Created many_versions.txt.124 Created many_versions.txt.125 Created many_versions.txt.126 Created many_versions.txt.127 Created many_versions.txt.128 Created many_versions.txt.129 Created many_versions.txt.130 Created many_versions.txt.131 Created many_versions.txt.132 Created many_versions.txt.133 Created many_versions.txt.134 Created many_versions.txt.135 Created many_versions.txt.136 Created many_versions.txt.137 Created many_versions.txt.138 Created many_versions.txt.139 Created many_versions.txt.140 Created many_versions.txt.141 Created many_versions.txt.142 Created many_versions.txt.143 Created many_versions.txt.144 Created many_versions.txt.145 Created many_versions.txt.146 Created many_versions.txt.147 Created many_versions.txt.148 Created many_versions.txt.149 Created many_versions.txt.150 Created many_versions.txt.151 Created many_versions.txt.152 Created many_versions.txt.153 Created many_versions.txt.154 Created many_versions.txt.155 Created many_versions.txt.156 Created many_versions.txt.157 Created many_versions.txt.158 Created many_versions.txt.159 Created many_versions.txt.160 Created many_versions.txt.161 Created many_versions.txt.162 Created many_versions.txt.163 Created many_versions.txt.164 Created many_versions.txt.165 Created many_versions.txt.166 Created many_versions.txt.167 Created many_versions.txt.168 Created many_versions.txt.169 Created many_versions.txt.170 Created many_versions.txt.171 Created many_versions.txt.172 Created many_versions.txt.173 Created many_versions.txt.174 Created many_versions.txt.175 Created many_versions.txt.176 Created many_versions.txt.177 Created many_versions.txt.178 Created many_versions.txt.179 Created many_versions.txt.180 Created many_versions.txt.181 Created many_versions.txt.182 Created many_versions.txt.183 Created many_versions.txt.184 Created many_versions.txt.185 Created many_versions.txt.186 Created many_versions.txt.187 Created many_versions.txt.188 Created many_versions.txt.189 Created many_versions.txt.190 Created many_versions.txt.191 Created many_versions.txt.192 Created many_versions.txt.193 Created many_versions.txt.194 Created many_versions.txt.195 Created many_versions.txt.196 Created many_versions.txt.197 Created many_versions.txt.198 |
class File
def File.versioned_file(base, first_suffix='.0', access_mode='w')
suffix = file = locked = nil
filename = base
begin
suffix = (suffix ? suffix.succ : first_suffix)
filename = base + suffix
unless File.exists? filename
file = open(filename, access_mode)
locked = file.flock(File::LOCK_EX | File::LOCK_NB)
file.close unless locked
end
end until locked
return file
end
end
File.versioned_file('contested_file') |
#<File:contested_file.0> | #<File:contested_file.0> |
File.versioned_file('contested_file') |
#<File:contested_file.1> | #<File:contested_file.1> |
File.versioned_file('contested_file') |
#<File:contested_file.2> | #<File:contested_file.2> |