0

我不确定这里发生了什么。我需要对 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
4

2 回答 2

1

当您使用execute(或此版本)时,您将使用结果集的行作为字符串数组,而不是简单的字符串。所以在这里:

$db.execute(...) do |mod|
  #...
end

mod将是一个包含单个字符串的数组。问题是您要保存该数组并将其视为字符串;通过足够的to_s调用和类似的处理,你会得到一个对你和 Ruby 来说都是正确的字符串,并且一切都会正常工作。

您应该自己解压缩行数组:

$db.execute(...) do |mod|
  lastMod = mod.first
  # ------------^^^^^
end
于 2012-12-09T21:18:07.160 回答
0

好吧,我想通了。我不确定为什么要修复它,因为我认为我基本上是这样做的,但是使用:

if !modTime.to_s.eql? lastMod.to_s

效果很好。。

于 2012-12-09T21:12:50.667 回答