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]))