【问题标题】:Copying files from one directory to another is not working in Ruby将文件从一个目录复制到另一个目录在 Ruby 中不起作用
【发布时间】:2015-09-10 12:46:57
【问题描述】:

我正在使用 fastlane 和快照自动创建屏幕截图。为此,我需要将数据复制到应用程序中。在这种情况下,一系列文件夹和文档从一个文件夹到 .app 容器中的另一个文件夹。

到目前为止,正在创建 Documents 文件夹,但从未将任何文件复制到其中。在这一点上,我不确定我是否错误地提供了路径,或者我可能做错了什么导致这种情况。可能只是因为我对 Ruby 不太熟悉,所以我编写了错误的代码。

任何建议将不胜感激,所以请告诉我,我缺少什么?

example_files = "./sample_data/Documents"
folder_name = "Documents"

setup_for_device_change do |lang, device|
  app_path = "/tmp/snapshot/build/SyncSpace.app/"

  FileUtils.mkdir_p(File.join(app_path, folder_name))

  Dir.glob(File.join(example_files, '*')).each do |example_path|
  FileUtils.cp_r(example_path, File.join(app_path, folder_name)) rescue nil # in case the file already exists
  end
end

更新 - 最后我的问题是我使用的路径对于我要传输的文件不能正常工作。当我给它一个从根级别到我需要的文件夹的完整路径时,它就可以工作了。尝试使用较短的路径仅包含工作目录上的其他文件夹会失败。

作为跟进,当我的工作目录是 .../fastlane 并且我的数据在 .../fastlane/sample_data/Documents 中时,为什么不直接使用 ./sample_data/Documents 工作?

【问题讨论】:

  • 我看到了两个选项:要么你的 glob 没有返回任何东西(因此永远不会进入块),要么你的 rescue nil 引发并吞下了异常。
  • 我在其中添加了一些 puts 行来检查,你是对的,它永远不会进入块。我是否认为这意味着它从一开始就没有找到要复制的文件?
  • 使用puts 可以进行调试,但它非常原始并且是一种霰弹枪方法。我强烈建议学习如何使用调试器或 Pry 或 IRB 作为调试器。调试器让您可以窥视正在运行的代码,准确了解正在发生的事情,并准确跟踪程序编写时的逻辑。

标签: ruby ios-simulator fileutils fastlane


【解决方案1】:

不要使用rescue nil。永远,或者至少在你非常清楚你的代码可以做什么以及为什么要使用它之前。而是使用以下的正常形式:

begin
  do_something
rescue TheExactExceptionYouWantToHandle => e
  # handle the exception
end

这样你就可以处理你所期望的事情,如果你没有预料到它就会爆炸。

几年前我的一位编程导师告诉我

永远不要测试您不知道如何处理的错误情况。

表面上听起来很傻,但经验告诉我们,我们可能会遇到这样的情况:程序在尝试做正确的事情时会做错事。最好快速安全地崩溃并吐出错误,而不是将其拖出并损坏试图恢复或默默掩盖错误的东西。调试不正确的程序可能会很痛苦,而尾随的rescue 是常见的罪魁祸首。

【讨论】:

  • 感谢您的建议并帮助我更多地了解救援正在做什么。我认为它只是需要的东西,而不是真正知道它的用途。在这种情况下,我什至没有达到代码中显示的那么远,所以它没有解决问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-15
  • 1970-01-01
  • 2017-11-18
  • 2013-06-01
  • 2020-06-22
  • 2014-08-12
相关资源
最近更新 更多