2

コードは次のとおりです。

Dir.foreach('C:\\Documents and Settings\\') { |entry|
    if File.directory?( entry )
        puts entry
    end
}

Dir.foreach('\\\\10.80.14.20\\transfer') { |entry|
    if File.directory?( entry )
        puts entry
    end
}

との両方C:\\Documents and Settings\\10.80.14.20ディレクトリが含まれます。ただし、下のフォルダーのみがリストされますC:\Documents and Settings。下のフォルダー\\\\10.80.14.20はリストされていませんが。File.directory?( entry )共有フォルダの下では動作しないようです。私は正しいですか?もしそうなら、共有フォルダの下にあるときにフォルダを識別する他の方法はありますか?

4

2 に答える 2

1

このプログラムを実行しようとしているマシン上\\10.80.14.20\transferの別のドライブとしてマップし、コードを次のように変更しますF:

Dir.foreach('f:\\') { |entry|
    if File.directory?("f:\\#{entry}")
        puts entry
    end
}

ただし、そのようなコードを Windows サービスとして実行する場合は、Windows サービスが外部にマップされたドライブを認識しないため、コード内からドライブをマップする必要があります。

require 'win32ole'
def map_my_drive
    net = WIN32OLE.new('WScript.Network')
    user_name = "<your_domain>\\<your_user>"
    password = "<your_password>"
    net.MapNetworkDrive( 'f:', "\\\\10.80.14.20\\transfer", nil,  user_name, password )
end 

map_my_drive

Dir.foreach('f:\\') { |entry|
    if File.directory?("f:\\#{entry}")
        puts entry
    end
}
于 2012-10-06T10:19:48.453 に答える
0

ローカルドライブにマウントできる場合はDir.foreach、オペレーティングシステムによって非表示になるため、標準で動作すると思います。

できない場合は、Ruby / SMBライブラリを使用できます。最近は機能するかどうかはわかりませんが、他のライブラリ( net-smb )も試すことができます。

サンプルコード(テストされていません):

require 'smb'

SMB::Dir.foreach('smb://10.80.14.20/transfer') do |entry|
  if entry.dir?
    puts entry
  end
end
于 2012-10-06T10:12:19.433 に答える