Ruby/File Directory/Utilities
Материал из Wiki.crossplatform.ru
Call system function to delete a folder
system("rm", "/tmp/file1") system("rm /tmp/file2")
Change a | delimited file
File.open("songdata") do |song_file| songs = SongList.new song_file.each do |line| file, length, name, title = line.chomp.split(/\s*\|\s*/) name.squeeze!(" ") songs.append(Song.new(title, name, length)) end puts songs[1] end
delete a folder recursively
def delete_all(dir) Dir.foreach(dir) do |e| # Don"t bother with . and .. next if [".",".."].include? e fullname = dir + File::Separator + e if FileTest::directory?(fullname) delete_all(fullname) else File.delete(fullname) end end Dir.delete(dir) end delete_all("dir1") # Remove dir1 and everything under it!
Delete folder older than a certain time
def delete_older(dir, time) save = Dir.getwd Dir.chdir(dir) Dir.foreach(".") do |entry| # We"re not handling directories here next if File.stat(entry).directory? # Use the modification time if File.mtime(entry) < time File.unlink(entry) end end Dir.chdir(save) end delete_older("/tmp",Time.local(2001,3,29,18,38,0))
Delete with condition
def delete_if(dir) save = Dir.getwd Dir.chdir(dir) Dir.foreach(".") do |entry| next if File.stat(entry).directory? if yield entry File.unlink(entry) end end Dir.chdir(save) end delete_if("/tmp") { |f| File.size(f) > 3000 }
Find files
require "find" def findfiles(dir, name) list = [] Find.find(dir) do |path| Find.prune if [".",".."].include? path case name when String list << path if File.basename(path) == name when Regexp list << path if File.basename(path) =~ name else raise ArgumentError end end list end findfiles "/home/hal", "toc.txt" findfiles "/home", /^[a-z]+.doc/
Get free disk space under unix with df command
def freespace(device=".") lines = %x(df -k #{device}).split("\n") n = lines.last.split[1].to_i * 1024 end puts freespace("/tmp")
Get free disk space under windows with dir command
def freespace(device=".") lines = %x(cmd /c dir #{device}).split("\n") n = lines.last.split[2].delete(",").to_i end puts freespace "C:"
Parse line: value|value
File.open("songdata") do |song_file| songs = SongList.new song_file.each do |line| file, length, name, title = line.chomp.split(/\s*\|\s*/) songs.append(Song.new(title, name, length)) end puts songs[1] end
Showing Line Numbers
def get_lines(filename) return File.open(filename, "r").readlines end def get_format(lines) return "%0#{lines.size.to_s.size}d" end def get_output(lines) format = get_format(lines) output = "" lines.each_with_index do |line,i| output += "#{sprintf(format, i+1)}: #{line}" end return output end print get_output(get_lines(ARGV[0]))