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

5

当目录不存在时,如何通过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实现相同的操作?

我忘了提到,我刚刚注意到使用上述代码上传文件时,它只上传了一个1kb的文件,这意味着它没有正常工作。 - Laurice Llona
现在一切都运行良好!!非常感谢您 :) 希望我能立即点赞! - Laurice Llona
1个回答

8
在这种情况下,最好的方式可能是先“不经允许而求原谅”,而不是“先征得许可”。这样还可以消除一种竞态条件,即您检查目录是否存在,发现它不存在,然后在创建它时因为它被其他人创建而出错。
以下代码将更有效:
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

谢谢Martin,我会尝试一下!如果对我有效,我会告诉你的。正如我在评论中所说,我还注意到我无法正确上传文件...它只显示1K。 - Laurice Llona
你可能想要检查特定的状态码,而不是忽略所有异常。 - Martin Prikryl
谢谢!这对我有用! 我的返回值是4,每当它返回4时,我就重新上传。 - Laurice Llona
2
@ethel同意了,但我想把评论放在那里。 - Martin Konecny
1
这应该特别重新引发 e,否则它将隐藏任何其他引发的 Net::SFTP::StatusException 并引发通用的 "RuntimeError"。 - AndrewKS
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接