Ruby `如果直接在刚刚创建的文件上的“system(';openssl…';)”之后运行,FileUtils.mv`将失败
我有以下代码:Ruby `如果直接在刚刚创建的文件上的“system(';openssl…';)”之后运行,FileUtils.mv`将失败,ruby,windows-subsystem-for-linux,Ruby,Windows Subsystem For Linux,我有以下代码: ... system("openssl ... -in #{path.shellescape} -out #{tmpfile.shellescape} ...") FileUtils.mv(tmpfile, path) ... 路径是随机文件.mobileprovision”,tmpfile是临时文件 代码应采用随机文件.mobileprovision,加密到临时文件中,然后将其复制回原始文件。执行FileUtils.mv时,两个文件都应该存在 但我得到一个类似这样的错误: E
...
system("openssl ... -in #{path.shellescape} -out #{tmpfile.shellescape} ...")
FileUtils.mv(tmpfile, path)
...
路径
是随机文件.mobileprovision”
,tmpfile
是临时文件
代码应采用随机文件.mobileprovision
,加密到临时文件中,然后将其复制回原始文件。执行FileUtils.mv
时,两个文件都应该存在
但我得到一个类似这样的错误:
Errno::ENOENT:
No such file or directory @ rb_file_s_rename - (temporary, randomFile.mobileprovision)
奇怪
在“调试”过程中,我在FileUtils.mv
前面放了一个“puts`ls`”,它突然工作了当我将
sleep(0.1)
放在FileUtils.mv…
前面时也是如此-它不再失败。发生什么事了
这让我相信,
系统
不是应该的同步(我无法想象……),或者openssl
在文件真正写入磁盘之前实际返回
为了检查,我将代码改为
system("openssl ...")
puts Time.now.round(10).iso8601(9)
puts `ls -l --time-style=full-iso #{Dir.mktmpdir}`
FileUtils.mv(tmpfile, path)
这将输出返回的系统
后的当前时间,然后获取目录列表以查看文件是否以及何时创建
我的输出:
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完成。该列表显示了仅在.32!处创建的
临时
文件
这怎么可能呢?如何修复或解决此问题
环境:
ruby 2.4.1p111(2017-03-22修订版58053)[x86_64-linux]
在Windows 10上的WSL(Windows linux子系统,Ubuntu的bash)中。不是一个解决方案,但比放一个目录列表更好:
因此,看起来您必须循环直到文件存在:
until File.exist?("file1.csv")
sleep 1
end
资料来源:
我将其与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
如果使用反勾号而不是system()
,会发生什么情况?e、 g.output=`openssl…`
另一种尝试:使用opensslgem,而不是向系统抛出。