我有这段代码:
@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
。
答案 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