Class: Net::SFTP::Operations::Dir
- Inherits:
-
Object
- Object
- Net::SFTP::Operations::Dir
- Defined in:
- lib/net/sftp/operations/dir.rb
Overview
A convenience class for working with remote directories. It provides methods for searching and enumerating directory entries, similarly to the standard ::Dir class.
sftp.dir.foreach("/remote/path") do |entry|
puts entry.name
end
p sftp.dir.entries("/remote/path").map { |e| e.name }
sftp.dir.glob("/remote/path", "**/*.rb") do |entry|
puts entry.name
end
Instance Attribute Summary collapse
-
#sftp ⇒ Object
readonly
The SFTP session object that drives this directory factory.
Instance Method Summary collapse
-
#[](path, pattern) ⇒ Object
Identical to calling #glob with a
flags
parameter of 0 and no block. -
#entries(path) ⇒ Object
Returns an array of Name objects representing the items in the given remote directory,
path
. -
#foreach(path) ⇒ Object
Calls the block once for each entry in the named directory on the remote server.
-
#glob(path, pattern, flags = 0) ⇒ Object
Works as ::Dir.glob, matching (possibly recursively) all directory entries under
path
againstpattern
. -
#initialize(sftp) ⇒ Dir
constructor
Create a new instance on top of the given SFTP session instance.
Constructor Details
#initialize(sftp) ⇒ Dir
Create a new instance on top of the given SFTP session instance.
23 24 25 |
# File 'lib/net/sftp/operations/dir.rb', line 23 def initialize(sftp) @sftp = sftp end |
Instance Attribute Details
#sftp ⇒ Object (readonly)
The SFTP session object that drives this directory factory.
20 21 22 |
# File 'lib/net/sftp/operations/dir.rb', line 20 def sftp @sftp end |
Instance Method Details
#[](path, pattern) ⇒ Object
Identical to calling #glob with a flags
parameter of 0 and no block. Simply returns the matched entries as an array.
88 89 90 |
# File 'lib/net/sftp/operations/dir.rb', line 88 def [](path, pattern) glob(path, pattern, 0) end |
#entries(path) ⇒ Object
Returns an array of Name objects representing the items in the given remote directory, path
.
42 43 44 45 46 |
# File 'lib/net/sftp/operations/dir.rb', line 42 def entries(path) results = [] foreach(path) { |entry| results << entry } return results end |
#foreach(path) ⇒ Object
Calls the block once for each entry in the named directory on the remote server. Yields a Name object to the block, rather than merely the name of the entry.
30 31 32 33 34 35 36 37 38 |
# File 'lib/net/sftp/operations/dir.rb', line 30 def foreach(path) handle = sftp.opendir!(path) while entries = sftp.readdir!(handle) entries.each { |entry| yield entry } end return nil ensure sftp.close!(handle) if handle end |
#glob(path, pattern, flags = 0) ⇒ Object
Works as ::Dir.glob, matching (possibly recursively) all directory entries under path
against pattern
. If a block is given, matches will be yielded to the block as they are found; otherwise, they will be returned in an array when the method finishes.
Because working over an SFTP connection is always going to be slower than working purely locally, don’t expect this method to perform with the same level of alacrity that ::Dir.glob does; it will work best for shallow directory hierarchies with relatively few directories, though it should be able to handle modest numbers of files in each directory.
58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 |
# File 'lib/net/sftp/operations/dir.rb', line 58 def glob(path, pattern, flags=0) flags |= ::File::FNM_PATHNAME path = path.chop if path.end_with?('/') && path != '/' results = [] unless block_given? queue = entries(path).reject { |e| %w(. ..).include?(e.name) } while queue.any? entry = queue.shift if entry.directory? && !%w(. ..).include?(::File.basename(entry.name)) queue += entries("#{path}/#{entry.name}").map do |e| e.name.replace("#{entry.name}/#{e.name}") e end end if ::File.fnmatch(pattern, entry.name, flags) if block_given? yield entry else results << entry end end end return results unless block_given? end |