Sha256: fab504bb4f076ab487fb99e07643f7c4bd0b70bfb21c6e24b91031cc803ae645

Contents?: true

Size: 1.64 KB

Versions: 4

Compression:

Stored size: 1.64 KB

Contents

module MyFind

	#
	# Calls the associated block with the name of every file and directory listed
	# as arguments, then recursively on their subdirectories, and so on.
	#
	# Returns an enumerator if no block is given.
	#
	# See the +Find+ module documentation for an example.
	#
	def find(*paths, ignore_error: true) # :yield: path
	  block_given? or return enum_for(__method__, *paths, ignore_error: ignore_error)
  
	  fs_encoding = Encoding.find("filesystem")
  
	  paths.collect!{|d| raise Errno::ENOENT, d unless File.exist?(d); d.dup}.each do |path|
		path = path.to_path if path.respond_to? :to_path
		enc = path.encoding == Encoding::US_ASCII ? fs_encoding : path.encoding
		ps = [path]
		while file = ps.shift
		  catch(:prune) do
			yield file.dup
			begin
			  s = File.lstat(file)
			rescue Errno::ENOENT, Errno::EACCES, Errno::ENOTDIR, Errno::ELOOP, Errno::ENAMETOOLONG, Errno::EPERM
			  raise unless ignore_error
			  next
			end
			if s.directory? then
			  begin
				fs = Dir.children(file, encoding: enc)
			  rescue Errno::ENOENT, Errno::EACCES, Errno::ENOTDIR, Errno::ELOOP, Errno::ENAMETOOLONG, Errno::EPERM
				raise unless ignore_error
				next
			  end
			  fs.sort!
			  fs.reverse_each {|f|
				f = File.join(file, f)
				ps.unshift f
			  }
			end
		  end
		end
	  end
	  nil
	end
  
	#
	# Skips the current file or directory, restarting the loop with the next
	# entry. If the current file is a directory, that directory will not be
	# recursively entered. Meaningful only within the block associated with
	# Find::find.
	#
	# See the +Find+ module documentation for an example.
	#
	def prune
	  throw :prune
	end
  
	module_function :find, :prune
  end

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
diskcatalog-1.1.0 lib/diskcatalog/my_find.rb
diskcatalog-1.0.0 lib/diskcatalog/my_find.rb
diskcatalog-0.9.0 lib/diskcatalog/my_find.rb
diskcatalog-0.3.0 lib/diskcatalog/my_find.rb