Pow → ‘Path Manipulation’

Get Version



Pow encapsulate the functionality of several ruby libraries (FileUtils, Files, Pathname and Dir) by creating objects out path strings.


sudo gem install pow

The basics

# The Simplest Example

require 'rubygems'
require 'pow'

path = Pow["."] # Let's create a pow object in the current directory.

Wow, amazing right? I guess not. But we’ll get to the good stuff. Let’s look at how pow deals with directories. Assume we are dealing with a directory structure like this

Demonstration of usage

Consider this directory structure

# Open up the /tmp dir
path = Pow["/tmp"]

# Check out what's inside
path.each {|child| puts "#{child} - #{child.class.name}" }


/tmp/README - Pow::File
/tmp/subdir - Pow::Directory
/tmp/suber_dir - Pow::Directory
/tmp/subdir/file.txt - Pow::File
/tmp/subdir/program - Pow::File
/tmp/extra_dir - Pow::Directory

Cool, but what if I just want the directories or just the files

path.files.each {|file| "This is a file #{file}"}
path.directories.each {|directory| "Here is a directory #{directory}"}

When pow encounters a directory it creates a Pow::Directory object. This is enumerable so you can use all your favorite iterative methods on directory structures now.

path.find_all {|p| p.directory? and p.modified_at > 1.day.ago}
path.reject {|p| p.permissions == 744}
path.collect {|p| p.size}

You can also create directories and files

path["new_dir"].create # New dir
path["tmp/tmp.file"].create # New file (if it has a '.' Pow considers it a file by default)"
path["tmp/also_a_file"].create_file # If you want to force file creation just use create_file (create_directory for the reverse)

You can read and write to files as well

# Shove some stuff into tmp.file
path["tmp/tmp.file"].open("w") do |file|
  file.puts "Hey Baby!"

# Get the stuff out of tmp.file"
path["tmp/tmp.file"].open do |file|
  puts file.read

# Alternatively

You can delete files and directories

rescue PowError => e
  puts "Oh no! It threw an error because the tmp dir is not empty... we will have to force it."


path.exists? # => false

With Pow you can also create directory structures such as

Pow["./moar"].create do
  Pow["sub_dir"].create do
    Pow["info.txt"].create {|file| file.puts "Here is the info you desired!"}
  Pow["README"].create_file {|file| file.puts "I'm so glad you read this."}

puts "So what are the dirs in tmp"
puts Pow["./moar"].directories.join(", ")

puts "What are the files in tmp"
puts Pow["./moar"].files.join(", ")

puts "Is the empty dir empty? #{Pow['./moar/empty_dir'].empty?}"

Pow["./moar"].delete! # Clean up your mess

So what are the dirs in tmp
/Users/corey/Code/pow/moar/empty_dir, /Users/corey/Code/pow/moar/sub_dir

What are the files in tmp

Is the empty dir empty? true

Is the there a super cool, but ultimately pointless way to create a Pow object?”

path = Pow["."]/:tmp/:sub_dir/:another_dir/:deeper_still/"a.file"


rubyforge forum

How to submit patches

Read the 8 steps for fixing other people’s code and for section 8b: Submit patch to Google Groups, use the Google Group above.

The trunk repository is svn://rubyforge.org/var/svn/pow/trunk for anonymous access.


This code is free to use under the terms of the MIT license.


All contact can be done through the rubyforge page http://rubyforge.org/projects/pow/

Corey Johnson, 9th October 2007
Theme extended from Paul Battley