Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 刷新sinatra应用程序读取更新的文件_Ruby_Sinatra_Refresh_Readfile - Fatal编程技术网

Ruby 刷新sinatra应用程序读取更新的文件

Ruby 刷新sinatra应用程序读取更新的文件,ruby,sinatra,refresh,readfile,Ruby,Sinatra,Refresh,Readfile,我正在用ruby编写一个sinatra应用程序,它将我的网络信息收集到两个不同的文件中。第一个是.csv,它收集有关网络中所有工作站的IP地址和给定名称的信息。第二个是.txt,读入星号服务器并收集链接到指定IP地址的活动SIP通道的信息 我的应用程序只是从这两个文件中编译信息,并在网页上创建表格,以匹配当前登录特定站点的用户。然而,我希望该应用程序假装实时使用。我让这两个文件每5分钟自动更新一次,但由于应用程序读取的文件被覆盖,应用程序的输出不会改变。有没有一种方法可以使应用程序在写入“新”文

我正在用ruby编写一个sinatra应用程序,它将我的网络信息收集到两个不同的文件中。第一个是.csv,它收集有关网络中所有工作站的IP地址和给定名称的信息。第二个是.txt,读入星号服务器并收集链接到指定IP地址的活动SIP通道的信息

我的应用程序只是从这两个文件中编译信息,并在网页上创建表格,以匹配当前登录特定站点的用户。然而,我希望该应用程序假装实时使用。我让这两个文件每5分钟自动更新一次,但由于应用程序读取的文件被覆盖,应用程序的输出不会改变。有没有一种方法可以使应用程序在写入“新”文件后读取这些文件

我对堆栈溢出进行了深入研究,我看到了一些东西,让python用户在重写这些文件之前只需观察这些文件中的更改,这将非常好。有ruby版本吗?此外,我希望该应用程序可以随时访问,并且可能只有在需要更新某些内容时才“刷新”,这样才有意义

当我意识到我在阅读完文件后再也不会关闭它们时,我也有了一个有趣的顿悟。我不会发布整个应用程序,但这里是我阅读文件的地方:

#Pulls active SIP channels from Asterisk
$sip = {}
File.open('sip.txt').each do |line|
  userid,ip = line.split(" ")
  $sip[ip] = userid[0..3]
end

#Prepares hash of all stations, ip addresses
$machines = {}
CSV.foreach('/Volumes/Scripts/report-51.csv') do |row|
  name = row[1]
  address = row[0]
  $machines[name] = address
end

有没有可能因为我从不关闭文件,程序就永远不会打开“新”文档?我只是想在这里集思广益。

很难说出正在发生的事情的总体结构,但是,是的,无论每5分钟调用一次代码,然后读取哪些文件,我都会确保每次调用都会在该代码中关闭和重新打开文件。那应该能解决你的问题


你也可以考虑切换到数据库方法以获得更健壮的结果。

嘿,Brad,很难告诉你正在发生的事情的整体结构,但是,不管是什么代码,每5分钟被调用一次,然后文件读取,我会确保文件被关闭并在每次调用的代码中重新打开。那应该能解决你的问题。也许有更好的办法,但我想那会管用的。嘿,谢谢!你知道我是需要在循环之前还是之后关闭它们吗?用文件中的每个条目关闭它们是没有意义的。我本以为它会像
File.close那样简单,但这给了我一个错误…”“未定义的方法close for File class”File=File.open(“temp.txt”,“r”);谢谢你,乔纳。需要一个关于如何做到这一点的提示,但它仍然无法解决问题。我现在正在考虑采取不同的方法。我将不使用需要刷新的文本文件,而是将信息添加到MySql表中。从那里,我将实时获取信息。有人认为这种解决方案有什么问题吗?这似乎是一种更有效的方法,尤其是当你有很多文件的时候。