Skip to content

Instantly share code, notes, and snippets.

@umedaikiti
Created August 29, 2013 07:05
Show Gist options
  • Save umedaikiti/6375002 to your computer and use it in GitHub Desktop.
Save umedaikiti/6375002 to your computer and use it in GitHub Desktop.
FuseFSのサンプルプログラム あらかじめ $sudo apt-get install fuse-devel libfuse-dev しといてください(Ubuntuの場合)
#試すときは
#sudo ruby fusefstest.rb <mountpoint>
#ls, mkdir, rmdir, cat, mv, vi, nanoとかは多分使える
#終わったら sudo umount <mountpoint>
#エラーのときにどうすればいいかわからない
#raise Errno::E*** は意味無さそう
#タイムスタンプやパーミッションの扱い方はわからない
#今のところtouchやchmod, chownなどのコマンドは使えない
require 'fusefs'
class Entry
@child
attr_reader :is_dir
attr_reader :is_file
attr_reader :name
attr_accessor :data
def initialize(name, is_file)
@child = []
@name = name
if is_file
@is_file = true
@is_dir = false
else
@is_file = false
@is_dir = true
end
end
def find_child(name)
return nil if @is_file
for c in @child do
if c.name == name
return c
end
end
return nil
end
def mkdir(name)
return nil if @is_file
c = Entry.new(name, false)
@child << c
return c
end
def create_file(name)
return nil if @is_file
c = Entry.new(name, true)
@child << c
return c
end
def contents
@child.map{|c| c.name}
end
def rename(name)
@name = name
end
def delete(name)
@child.delete_if{|c| c.name == name && c.is_file}
end
def rmdir(name)
@child.delete_if{|c| c.name == name && c.is_dir}
end
end
#http://rubydoc.info/github/lwoggardner/rfusefs/FuseFS/API 参照
class HelloDir
@root
def initialize
@root = Entry.new(nil, false)
@root.mkdir('dir')
@root.create_file('hello.txt').data = "Hello, world!\n"
end
def get_entry(path)
if path == '/'
return @root
end
e = @root
while e
i = path.index('/', 1)
if i == nil
e = e.find_child(path[1..-1])
break
end
e = e.find_child(path[1..(i-1)])
path = path[i..-1]
end
return e
end
def contents(path)
e = get_entry(path)
return e.contents if e
end
def directory?(path)
e = get_entry(path)
return e.is_dir if e
end
def file?(path)
e = get_entry(path)
return e.is_file if e
end
def read_file(path)
e = get_entry(path)
return e.data if e && e.is_file
end
def size(path)
read_file(path).size
end
def can_write?(path)
e = get_entry(File.dirname(path))
return e ? e.is_dir : false
end
#ファイルが存在しないときは新しく作成して書き込む
def write_to(path, str)
e = get_entry(path)
p = get_entry(File.dirname(path))
e = p.create_file(File.basename(path)) if e == nil
e.data = str if e && e.is_file
end
def can_mkdir?(path)
e = get_entry(File.dirname(path))
return e ? e.is_dir : false
end
def mkdir(path)
e = get_entry(File.dirname(path))
e.mkdir(File.basename(path)) if e
end
#定義しても呼び出されていないっぽい
# def touch(path, modtime)
# p modtime
# end
#
# def times(path)
# puts "times(#{path})"
# return [1,2,3]
# end
def rename(from_path, to_path)
return false if File.dirname(from_path) != File.dirname(to_path)
e = get_entry(from_path)
e.rename(File.basename(to_path)) if e
return e
end
def can_delete?(path)
e = get_entry(path)
return e && e.is_file
end
def delete(path)
e = get_entry(File.dirname(path))
e.delete(File.basename(path)) if e
end
def can_rmdir?(path)
e = get_entry(path)
return e && e.is_dir
end
def rmdir(path)
e = get_entry(File.dirname(path))
e.rmdir(File.basename(path)) if e
end
end
hellodir = HelloDir.new
FuseFS.set_root( hellodir )
FuseFS.mount_under ARGV.shift
FuseFS.run
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment