2012-10-06 85 views
2

下面的代碼:ruby​​目錄功能

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)無法在共享文件夾下工作。我對嗎?如果是這樣,有沒有其他方法來識別共享文件夾下的文件夾?

回答

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 
} 
+0

感謝您的回答。但** File.directory?**不起作用,即使我已將** \\ 10.80.14.20 \ transfer **映射爲單獨的驅動器。 – mCY

+0

你可以改變你的代碼來使用完整路徑,它應該工作。 'Dir.foreach('f:\\'){| entry |把條目放入File.directory?(「f:\\#{entry}」)}' – saihgala

+0

非常感謝!它在完整路徑添加完成後生效。 – mCY

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 
+0

我的操作系統是windows,所以我沒有嘗試,如果它將工作,如果我裝載它。我嘗試將共享文件夾映射爲本地驅動器。但它也不起作用。我想嘗試net-smb,但是我沒有安裝它。它給了我這個錯誤:檢查libsmbclient.h ...不。無論如何感謝您的回答。 – mCY

+0

我的意思是在安裝時進行映射。您將需要samba庫來編譯net-smb模塊。 –