我有一个 ruby 脚本,它运行等待扫描的 pdf 文档上传到路径,然后进行一些额外的处理和通知。扫描仪是佳能 ImageRunner 扫描仪,使用扫描到 ftp 路径,服务器运行
vsftpd
,配置非常简单。
require 'rb-inotify'
notifier = INotify::Notifier.new
notifier.watch("/root/test", :close_write) do |event|
p event.absolute_name
p event.name
end
notifier.run
通常一切都会按预期进行,我们会按预期返回文件名和完整路径。
"/root/test/doc1.pdf"
"doc1.pdf"
"/root/test/doc2.pdf"
"doc2.pdf"
但是我们有一个新的扫描仪设备,当我们从该机器扫描文档时,会报告初始文件名,并在名称末尾附加一个额外的
~
(波形符)(这会破坏处理脚本中其他地方的许多内容) )
"/root/test/doc1.pdf~"
"doc1.pdf~"
"/root/test/doc2.pdf~"
"doc2.pdf~"
但是当我检查实际文件夹时,文件以正确的名称存储,并且没有
~
。
我猜这是新扫描仪实际将文件写入服务器的方式的一些奇怪问题。
作为一个非常快速和肮脏的黑客,我做了一个测试,从表面上有效的路径中删除了尾随的
~
和 [0...-1]
,但后来在更大的处理脚本中破坏了其他东西。
解决此问题最安全的方法是什么,以便我只能得到正确的文件名报告? (仅删除最后一个字符是不切实际的,因为手动上传以及可能使用的其他扫描仪都会返回正确的文件名,并且在我的肮脏黑客中最终会变成
doc1.pd
)
怀疑这是较新的扫描仪硬件的一些假象,较旧的设备和用于测试的 MFD 没有此问题。
基于 engineersmnky 评论,我最终得到以下结果;
notifier.watch("/root/test/", :close_write) do |event|
file_path = event.absolute_name[/(.*[^~])/]
file_name = event.name[/(.*[^~])/]
puts "#{file_path} is now uploaded"
sleep(1)
copy_file(file_path, file_name)
end
[/(.*[^~])/]
从文件名中删除错误的~
,并且sleep(1)
足以让文件系统跟上并且脚本的其余部分按预期运行。