ruby をより魅力的にするために。
リリース版はまだありません。
RAA に登録しました。
snapshot tarball のディレクトリ を 覗くと幾つかあります。
ファイルとディレクトリの抽象化を行う為のクラスです。 大きな目的は目的は以下の2つ。
例えば以下のようなコードを書けるようになることが目標です。
f = VFS::File.new("/var/tmp/moge")
# インスタンスの作成時には何もしません。
p f.ctime # => Fri Nov 21 13:25:21 JST 2003
p f.size # => 300
f.mtime = 300
f.uid = 1000
f.oepn { |io| # open すると IO が返る
puts io.read(20)
}
f.open("w") { |io|
io << "moge"
}
f.rename("/tmp/moge") # 自分の参照するファイルも変更される
f.unlink # "/tmp/moge" が消える
f = VFS::File.new("http://serv/path/to/file.html")
p f.mtime # Last-Modified ヘッダなどから Time クラスを生成して返す
インターフェースをまだ模索中です。 後述する互換レイヤはほぼ動くようになりましたのでそちらを使ってみて下さい。
スキームが指定されなかった場合はローカルファイルと見なされます。
以下のような形式のが使えます。
サーバが対応していれば、WebDAV 拡張が使えます。 PROPFIND などのプロトコルにより、VFS::File#mtime 等が正しく動きますし、 書き込みを行うこともできます。ただし、現状ではロックはサポートしていません。
また現在、相手が WebDAV のプロトコルをサポートしていない場合は、 ディレクトリの扱いにかなり制限があります。具体的には VFS::File#file? は 常に true を、 VFS::File#direcotry? は常に false を返します。
(VirtualHost単位の)1つのサーバに対して1つのコネクションを持ちます。
openssl ライブラリが必要です。 後は http と同じです。
(特になし)
rubyzip ライブラリが必要です。
恐らくまだバグがかなり残っています。 また、rubyzip ライブラリ側に依存した制限が幾つかあります。 例えば、open で帰ってくるIO は幾つかのメソッドが足りません。
URL は
zip:(アーカイブパス)(アーカイブの中のパス)
の様に記述します。URL 中に ! を見つけると、そこまでを zip アーカイブのパスとみなします。
また、アーカイブのパスそのままもう一度 VFS::File.new に渡されるので、 ネストした URL を書くことも出来ます。例えば、
zip:http://serv/dir/archcive.zip!dir_in_zip/memo.txt
は http(WebDAV)サーバ上のzipファイルの中のディレクトリの更に中の memo.txt を示します。
URL を使ったネットワーク/アーカイブ透過だけを手軽に実現するための物です。
VFS::CompatLayer::File, VFS::CompatLayer::Dir, VFS::CompatLayer::Stat が用意されていて、それぞれ組み込みクラスと同じインターフェースを持ちます。
vfs.rb を require すると、組み込みクラスが互換レイヤで上書きされ、 引数に URL が渡せるようになります。
これにより、既存のライブラリを変更無しでネットワーク透過にすることが出来ます。
http://sugi.nemui.org/pub/ruby/vfs/ の 24時間以内に更新されたファイルを表示
require 'vfs'
dir = "http://sugi.nemui.org/pub/ruby/vfs/"
p Dir.new(dir) { |d|
d.each { |fname|
if Time.now - File.mtime(dir + fname) < 24 * 60 * 60
puts %["#{fname}" has been updated in 24 hours.]
end
}
}
WebDAV サーバ上に Tempfile を作る(作ってもあんまり意味ありませんが……)。
require 'vfs'
require 'tempfile'
Tempfile.new("tempfiletest", "http://davserv/dir/moge") { |temp|
# いろいろ....
}
HTTP サーバから再帰的にカレントディレクトリへダウンロード。
require 'fileutils'
require 'vfs'
FileUtils.cp_r("http://sugi.nemui.org/pub/perl/", ".")
un.rb を使って FTP サーバにディレクトリを再帰アップロード。
% ruby -r vfs -run cp -- -r ~/works/myweb ftp://user:pass@myserver/home/myid/public_html/
まだ模索中のため、大幅に変更される可能性があります。
現状では組み込み Dir と同じですが、 Dir クラスのインターフェースは大きく変更予定です。 まだ直接使わないで下さい。
yet.