我不确定这里发生了什么。我需要在两个变量Times上运行字符串比较。一个变量是使用.mtime函数的Time对象。另一个变量取自sqlite3数据库。我想比较这些时间,看看修改日期是否与sqlite3表中列出的最后修改日期不同。这是该部分的代码。
当我打印出它们看起来相同的值时...那么为什么比较不起作用
def scanfile
dir = Dir.new(Dir.pwd)
dir.each do |file|
fileName = File.basename(file)
modTime = File.mtime(file).strftime("%F %T")
lastMod = nil
exists = checkDB(fileName)
if exists == true
$db.execute("SELECT DateMod FROM Files WHERE fileName = '#{fileName}'") do |mod|
lastMod = mod
end
mod = modTime.to_s
printf("modTime: #{mod} lastMod: #{lastMod}\n")
if mod != lastMod
$db.execute("UPDATE Files SET NumMods=NumMods+1 WHERE fileName = '#{fileName}'")
$db.execute("UPDATE Files SET DateMod='#{modTime}' WHERE fileName = '#{fileName}'")
print "#{fileName} updated...\n"
end
else
if fileName != "." && fileName != ".."
inputRecord(fileName, modTime, modTime, 1)
print "#{fileName} inserted...\n"
end
end
end
end
答案 0 :(得分:1)
当您使用execute
(或this version)时,您将使用结果集的行作为字符串数组,而不是简单的字符串。所以在这里:
$db.execute(...) do |mod|
#...
end
您的mod
将是一个包含单个字符串的数组。问题是你要保存该数组并将其视为字符串;通过足够的to_s
调用和类似的修改,你将得到一个对你和Ruby都一致的字符串,一切都会正常工作。
您应该自己解压缩行数组:
$db.execute(...) do |mod|
lastMod = mod.first
# ------------^^^^^
end
答案 1 :(得分:0)
好吧我明白了。我不确定为什么要修复它,因为我认为我基本上是这样做但是使用:
if !modTime.to_s.eql? lastMod.to_s
运作良好..