如果目录已存在,则在Ruby上通过SFTP创建目录失败

时间:2015-05-22 05:02:11

标签: ruby-on-rails ruby directory sftp fileutils

如果目录不存在,如何通过SFTP在Ruby上创建目录?

我现在有以下代码:

Net::SFTP.start( ip, id, :password => pass, :port=> port ) do |sftp|
    sftp.mkdir! remotePath
    sftp.upload!(localPath + localfile, remotePath + remotefile)
end

我第一次创建目录没有问题,但它尝试重新创建同一个目录,即使它已经存在并且它会引发错误。

任何知道怎么做的人?

在使用fileutils时,有以下代码:

 FileUtils.mkdir_p(remotePath) unless File.exists?(remotePath)

有什么方法可以通过SFTP做同样的事情吗?

1 个答案:

答案 0 :(得分:3)

在这种情况下,最好简单地“请求宽恕”,然后“请求许可”。它还消除了竞争条件,您可以在其中检查目录是否存在,发现它不存在,然后在创建它时出错,因为它是由其他人在此期间创建的。

以下代码将更好用:

Net::SFTP.start( ip, id, :password => pass, :port=> port ) do |sftp|
    begin
        sftp.mkdir! remotePath
    rescue Net::SFTP::StatusException => e
        # verify if this returns 11. Your server may return
        # something different like 4.
        if e.code == 11
            # directory already exists. Carry on..
        else 
            raise
        end 
    end
    sftp.upload!(localPath + localfile, remotePath + remotefile)
end