如果在刚刚创建的文件`system('openssl ...')`之后直接运行,`FileUtils.mv`会失败

时间:2017-12-10 04:49:35

标签: ruby windows-subsystem-for-linux

我有这段代码:

@IBOutlet weak var toolbar: UIToolbar!
override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}


@IBAction func leftAction(_ sender: Any) {
}

@IBAction func rightAction(_ sender: Any) {

}

@IBAction func changeLeftItems(_ sender: Any) {
    if let items = self.navigationItem.leftBarButtonItems {
        var addItems = [UIBarButtonItem]()
        addItems.append(contentsOf: items)
        let barItem = UIBarButtonItem(title: "3", style: UIBarButtonItemStyle.plain, target: self, action: #selector(ViewController.leftAction(_:)))
        addItems.append(barItem)
        self.navigationItem.leftBarButtonItems = addItems
    }
    if let items = self.toolbar.items {
        var addItems = [UIBarButtonItem]()
        addItems.append(contentsOf: items)
        let barItem = UIBarButtonItem(title: "L3", style: UIBarButtonItemStyle.plain, target: self, action: #selector(ViewController.leftAction(_:)))
        addItems.insert(barItem, at: 2)
        self.toolbar.setItems(addItems, animated: true)
    }
}

... system("openssl ... -in #{path.shellescape} -out #{tmpfile.shellescape} ...") FileUtils.mv(tmpfile, path) ... path"randomFile.mobileprovision"tmpfile

代码应该使用"temporary",加密到临时文件中,然后将其复制回原始文件。执行randomFile.mobileprovision时,两个文件都应该存在。

但我收到这样的错误:

FileUtils.mv

奇怪。

在“调试”期间,我在Errno::ENOENT: No such file or directory @ rb_file_s_rename - (temporary, randomFile.mobileprovision) 前面放了一个“puts`ls`” - 突然它起作用了!
FileUtils.mv放在sleep(0.1)前面时相同 - 它 不再失败。
发生了什么事?

这让我相信FileUtils.mv...不是应该是同步的(我无法想象......)或system实际上在文件真正写入之前返回磁盘。

要检查我是否已将代码更改为

openssl

这将输出system("openssl ...") puts Time.now.round(10).iso8601(9) puts `ls -l --time-style=full-iso #{Dir.mktmpdir}` FileUtils.mv(tmpfile, path) 返回后的当前时间,然后获取目录列表以查看文件是否以及何时创建。

我的输出:

system

所以2017-12-10T05:40:58.309145900+01:00 total 0 -rw-rw-rw- 1 sujan sujan 20 2017-12-10 05:40:58.291071400 +0100 randomFile.mobileprovision -rw-rw-rw- 1 sujan sujan 65 2017-12-10 05:40:58.320572900 +0100 temporary 是在.30完成的 该清单显示system文件仅在.32!?

创建

这怎么可能?
我该如何解决或解决这个问题?

环境:Windows 10中的WSL(适用于Linux的Windows子系统,Ubuntu的bash)中的temporary

1 个答案:

答案 0 :(得分:0)

不是解决方案,而是比puts目录列表更好的解决方法:

  

所以看起来你必须循环直到文件存在:

until File.exist?("file1.csv")
  sleep 1
end

来源:https://stackoverflow.com/a/4539472/252627

我使用0.1代替1,上限为2秒,一切都取决于不在Mac系统上:

  unless Helper.is_mac?
    count = 0
    # sleep until file exists or 20*0.1s (=2s) passed
    until File.exist?(tmpfile) || count == 20
      sleep(0.1)
      count += 1
    end
  end