2011-08-02 97 views
0

我想編寫一個以編程方式檢測我的rails應用程序中的任何文件是否已更改的方法。是否有可能做一些類似於整個應用程序的MD5,並將其存儲在會話變量中?Rails以編程方式檢測對文件的更改

這主要是爲了讓一些樂趣與緩存清單。我已經有一個動態生成的緩存,並且在生產環境中工作良好。但是在我的開發環境中,我希望每當我更改app目錄中的任何內容(而不是每隔10秒,這就是我現在設置的狀態)時,該緩存的id就會更新。

更新

File.ctime( 「 」)將是完美的,除了「。」在更深的目錄文件發生更改時未被標記爲已更改。

是否有意義遍歷「。」中的所有目錄。並將每個ctimes加在一起?

+0

這可能有助於添加詳細信息,說明爲什麼您需要這樣做,以便我們能給您一個更好的答案。 –

+0

你能否介紹一下爲什麼你需要這個?如果它用於解僱你的測試,你可以使用自動測試寶石。但我不明白爲什麼會需要這個的另一個原因。 – Sohan

回答

0

File.ctime是關鍵。通過所有文件進行迭代,並創建一個基於他們所有的ctimes的總和一個唯一的ID:

cache_id = 0 
Dir.glob('./**/*') do |this_file| 
    ignore_files = ['.', '..', "log"] 
    ignore_files.each do |ig| 
     next if this_file == ig 
    end 
    cache_id += File.ctime(this_file).to_i if File.directory?(this_file) 
end 

得好好的,頁面只有重新緩存時,它需要,甚至在發展。

2

您是否考慮過使用Guard

只要項目中的文件發生變化,您就可以以編程方式執行任何操作。

有一個很好的railscast約it

1

有一個叫filewatcher一個簡單的紅寶石的寶石。這是最高級的示例:

require 'filewatcher' 

FileWatcher.new(["README.rdoc"]).watch() do |filename, event| 
    if(event == :changed) 
    puts "File updated: " + filename 
    end 
    if(event == :delete) 
    puts "File deleted: " + filename 
    end 
    if(event == :new) 
    puts "New file: " + filename 
    end 
end 
相關問題