Class: Ole::Storage::DirClass
- Inherits:
-
Object
- Object
- Ole::Storage::DirClass
- Defined in:
- lib/ole/file_system.rb
Overview
an instance of this class is supposed to provide similar methods to the class methods of Dir itself.
pretty complete. like zip/zipfilesystem’s implementation, i provide everything except chroot and glob. glob could be done with a glob to regex regex, and then simply match in the entries array… although recursive glob complicates that somewhat.
Dir.chroot, Dir.glob, Dir.[], and Dir.tmpdir is the complete list.
Defined Under Namespace
Classes: Dir
Instance Method Summary collapse
- #chdir(orig_path) ⇒ Object
- #entries(path) ⇒ Object
- #foreach(path, &block) ⇒ Object
-
#initialize(ole) ⇒ DirClass
constructor
A new instance of DirClass.
-
#mkdir(path) ⇒ Object
there are some other important ones, like: chroot (!), glob etc etc.
-
#new(path) ⇒ Object
as for file, explicit alias to inhibit block.
- #open(path) ⇒ Object
-
#pwd ⇒ Object
(also: #getwd)
pwd is always stored without the trailing slash.
- #rmdir(path) ⇒ Object (also: #delete, #unlink)
Constructor Details
#initialize(ole) ⇒ DirClass
Returns a new instance of DirClass.
268 269 270 271 |
# File 'lib/ole/file_system.rb', line 268 def initialize ole @ole = ole @pwd = '' end |
Instance Method Details
#chdir(orig_path) ⇒ Object
309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 |
# File 'lib/ole/file_system.rb', line 309 def chdir orig_path # make path absolute, squeeze slashes, and remove trailing slash path = @ole.file.(orig_path).gsub(/\/+/, '/').sub(/\/$/, '') # this is just for the side effects of the exceptions if invalid dirent_from_path path, orig_path if block_given? old_pwd = @pwd begin @pwd = path yield ensure @pwd = old_pwd end else @pwd = path 0 end end |
#entries(path) ⇒ Object
328 329 330 331 332 333 334 335 336 337 338 339 340 |
# File 'lib/ole/file_system.rb', line 328 def entries path dirent = dirent_from_path path # Not sure about adding on the dots... entries = %w[. ..] + dirent.children.map(&:name) # do some checks about un-reachable files seen = {} entries.each do |n| Log.warn "inaccessible file (filename contains slash) - #{n.inspect}" if n['/'] Log.warn "inaccessible file (duplicate filename) - #{n.inspect}" if seen[n] seen[n] = true end entries end |
#foreach(path, &block) ⇒ Object
342 343 344 |
# File 'lib/ole/file_system.rb', line 342 def foreach path, &block entries(path).each(&block) end |
#mkdir(path) ⇒ Object
there are some other important ones, like: chroot (!), glob etc etc. for now, i think
348 349 350 351 352 353 354 355 356 357 358 359 |
# File 'lib/ole/file_system.rb', line 348 def mkdir path # as for rmdir below: parent_path, basename = File.split @ole.file.(path) # note that we will complain about the full path despite accessing # the parent path. this is consistent with ::Dir parent = dirent_from_path parent_path, path # now, we first should ensure that it doesn't already exist # either as a file or a directory. raise Errno::EEXIST, path if parent/basename parent.children << Dirent.new(@ole, :type => :dir, :name => basename) 0 end |
#new(path) ⇒ Object
as for file, explicit alias to inhibit block
294 295 296 |
# File 'lib/ole/file_system.rb', line 294 def new path open path end |
#open(path) ⇒ Object
284 285 286 287 288 289 290 291 |
# File 'lib/ole/file_system.rb', line 284 def open path dir = Dir.new path, entries(path) if block_given? yield dir else dir end end |
#pwd ⇒ Object Also known as: getwd
pwd is always stored without the trailing slash. we handle the root case here
300 301 302 303 304 305 306 |
# File 'lib/ole/file_system.rb', line 300 def pwd if @pwd.empty? '/' else @pwd end end |
#rmdir(path) ⇒ Object Also known as: delete, unlink
361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 |
# File 'lib/ole/file_system.rb', line 361 def rmdir path dirent = dirent_from_path path raise Errno::ENOTEMPTY, path unless dirent.children.empty? # now delete it, how to do that? the canonical representation that is # maintained is the root tree, and the children array. we must remove it # from the children array. # we need the parent then. this sucks but anyway: # we need to split the path. but before we can do that, we need # to expand it first. eg. say we need the parent to unlink # a/b/../c. the parent should be a, not a/b/.., or a/b. parent_path, basename = File.split @ole.file.(path) # this shouldn't be able to fail if the above didn't parent = dirent_from_path parent_path # note that the way this currently works, on save and repack time this will get # reflected. to work properly, ie to make a difference now it would have to re-write # the dirent. i think that Ole::Storage#close will handle that. and maybe include a # #repack. parent.children.delete dirent 0 # hmmm. as per ::Dir ? end |