0

ここで何が起こっているのかわかりません。Times である 2 つの変数で文字列比較を実行する必要があります。1 つの変数は、.mtime 関数を使用する Time オブジェクトです。もう 1 つの変数は、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 に答える