Class | Ole::Storage::FileClass |
In: |
lib/ole/storage/file_system.rb
|
Parent: | Object |
# File lib/ole/storage/file_system.rb, line 141 141: def directory? path 142: dirent = @ole.dirent_from_path path 143: dirent and dirent.dir? 144: end
# File lib/ole/storage/file_system.rb, line 131 131: def exists? path 132: !!@ole.dirent_from_path(path) 133: end
# File lib/ole/storage/file_system.rb, line 109 109: def expand_path path 110: # get the raw stored pwd value (its blank for root) 111: pwd = @ole.dir.instance_variable_get :@pwd 112: # its only absolute if it starts with a '/' 113: path = "#{pwd}/#{path}" unless path =~ /^\// 114: # at this point its already absolute. we use File.expand_path 115: # just for the .. and . handling 116: # No longer use RUBY_PLATFORM =~ /win/ as it matches darwin. better way? 117: File.expand_path(path)[File::ALT_SEPARATOR == "\\" ? (2..-1) : (0..-1)] 118: end
# File lib/ole/storage/file_system.rb, line 136 136: def file? path 137: dirent = @ole.dirent_from_path path 138: dirent and dirent.file? 139: end
explicit wrapper instead of alias to inhibit block
# File lib/ole/storage/file_system.rb, line 164 164: def new path, mode='r' 165: open path, mode 166: end
# File lib/ole/storage/file_system.rb, line 146 146: def open path, mode='r', &block 147: if IO::Mode.new(mode).create? 148: begin 149: dirent = dirent_from_path path 150: rescue Errno::ENOENT 151: # maybe instead of repeating this everywhere, i should have 152: # a get_parent_dirent function. 153: parent_path, basename = File.split expand_path(path) 154: parent = @ole.dir.send :dirent_from_path, parent_path, path 155: parent.children << dirent = Dirent.new(@ole, :type => :file, :name => basename) 156: end 157: else 158: dirent = dirent_from_path path 159: end 160: dirent.open mode, &block 161: end
most of the work this function does is moving the dirent between 2 parents. the actual name changing is quite simple. File.rename can move a file into another folder, which is why i‘ve done it too, though i think its not always possible…
FIXME File.rename can be used for directories too.…
# File lib/ole/storage/file_system.rb, line 200 200: def rename from_path, to_path 201: # check what we want to rename from exists. do it this 202: # way to allow directories. 203: dirent = @ole.dirent_from_path from_path 204: raise Errno::ENOENT, from_path unless dirent 205: # delete what we want to rename to if necessary 206: begin 207: unlink to_path 208: rescue Errno::ENOENT 209: # we actually get here, but rcov doesn't think so. add 1 + 1 to 210: # keep rcov happy for now... :) 211: 1 + 1 212: end 213: # reparent the dirent 214: from_parent_path, from_basename = File.split expand_path(from_path) 215: to_parent_path, to_basename = File.split expand_path(to_path) 216: from_parent = @ole.dir.send :dirent_from_path, from_parent_path, from_path 217: to_parent = @ole.dir.send :dirent_from_path, to_parent_path, to_path 218: from_parent.children.delete dirent 219: # and also change its name 220: dirent.name = to_basename 221: to_parent.children << dirent 222: 0 223: end
# File lib/ole/storage/file_system.rb, line 168 168: def size path 169: dirent_from_path(path).size 170: rescue Errno::EISDIR 171: # kind of arbitrary. I'm getting 4096 from ::File, but 172: # the zip tests want 0. 173: 0 174: end
# File lib/ole/storage/file_system.rb, line 176 176: def size? path 177: dirent_from_path(path).size 178: # any other exceptions i need to rescue? 179: rescue Errno::ENOENT, Errno::EISDIR 180: nil 181: end
# File lib/ole/storage/file_system.rb, line 183 183: def stat path 184: # we do this to allow dirs. 185: dirent = @ole.dirent_from_path path 186: raise Errno::ENOENT, path unless dirent 187: Stat.new dirent 188: end
crappy copy from Dir.
# File lib/ole/storage/file_system.rb, line 226 226: def unlink(*paths) 227: paths.each do |path| 228: dirent = @ole.dirent_from_path path 229: # i think we should free all of our blocks from the 230: # allocation table. 231: # i think if you run repack, all free blocks should get zeroed, 232: # but currently the original data is there unmodified. 233: open(path) { |f| f.truncate 0 } 234: # remove ourself from our parent, so we won't be part of the dir 235: # tree at save time. 236: parent_path, basename = File.split expand_path(path) 237: parent = @ole.dir.send :dirent_from_path, parent_path, path 238: parent.children.delete dirent 239: end 240: paths.length # hmmm. as per ::File ? 241: end
orig_path is just so that we can use the requested path in the error messages even if it has been already modified
# File lib/ole/storage/file_system.rb, line 122 122: def dirent_from_path path, orig_path=nil 123: orig_path ||= path 124: dirent = @ole.dirent_from_path path 125: raise Errno::ENOENT, orig_path unless dirent 126: raise Errno::EISDIR, orig_path if dirent.dir? 127: dirent 128: end