2010-05-08 58 views
5

什麼是最好的方式來檢查添加到目錄中的新文件,我不認爲文件系統監視器是合適的,因爲這不是一個永遠在線的服務,而是一個當我的程序啓動時運行的方法。目錄監控

我正在監視的文件夾結構中有超過20,000個文件,目前我正逐個檢查每個文件以查看文件路徑是否在我的數據庫表中,但這大約需要十分鐘,我想加快它

我可以存儲上次檢查文件夾的日期 - 是否容易得到具有createddate>上次檢查日期的所有文件。

任何人有任何想法?

感謝

馬克

+0

這是一個有趣的問題。我不知道如何跟蹤目錄的更改,而無需駐留內存的程序來註冊這些事件。 (順便說一句,這些觀察者也有其侷限性)。您可能必須重新掃描目錄樹(啓動時,定期,每當),唯一的問題是如何儘可能快速高效地完成目錄樹。 – 2010-05-08 08:59:31

回答

5

您的方法是唯一可行的(即文件系統監視器允許您查看更改,而不是檢查啓動)。

找出需要這麼長時間。 20.000次檢查不應花費10分鐘 - 最多1次。你的程序寫得很慢。你如何測試它?

提示:不要問數據庫,獲取所有文件列表到內存中,數據庫中所有文件的列表,檢查內存。 20.000到數據庫的SQL語句太慢了,這樣你需要ONE來獲取列表。

+0

提示tomtom歡呼,你說得對我的程序調用每個文件的數據庫,當然我可以重構一個區域。 – foz1284 2010-05-08 09:09:03

0

你可以寫那臺機器上運行的服務?該服務可以使用FileSystemWtcher

+0

感謝,我想過這個問題,但不喜歡有一個服務,只是個人喜好 – foz1284 2010-05-08 09:11:43

+0

這仍然不能保證你不會錯過任何改變觀念。另外 - 一般來說 - 有一個服務運行只是爲了一個應用程序,現在運行,然後是不好的設計。當然,在這種情況下,它可能是可以接受的。它取決於應用程序的類型。 – Thorarin 2010-05-08 09:13:44

1

FileSystemWatchernotreliable,所以即使您可以使用服務,它也不一定適合您。

兩個選項,我可以看到的是:

  1. 讓你知道文件的列表,並保持比較到此列表中。這將允許您查看是否添加,刪除等文件。將此列表保存在內存中,而不是查詢每個文件的數據庫。
  2. 正如你所建議的那樣,存儲一個時間戳並與其進行比較。
+0

時間戳方法應該工作得很好,但是*只*如果您不必檢查刪除的文件。這不是問題的一部分,但有意義的是,你也有興趣知道這一點。可能的話,您可以更頻繁地檢查刪除的文件,或在後臺或其他地方進行檢查。 – Thorarin 2010-05-08 09:02:00

2

對於20,000個文件,10分鐘似乎非常長。你如何進行比較?您的建議也不會考慮刪除的文件。如果你想從數據庫中刪除那些,你將不得不做一個完整的比較。

也許問題是數據庫往返旅行。您可以從數據庫中以大塊(或全部一次)檢索已知文件列表,並按字母順序排序。對本地文件列表進行排序,然後走兩個列表,隨時處理缺失或新條目。

+0

你說得對這個問題是往返,我不需要擔心已刪除的文件,我檢查這個我嘗試加載一個文件歡呼 – foz1284 2010-05-08 09:10:47

+0

@ foz1284每次:在這種情況下,使用時間戳是一個選項。它們在技術上不是100%可靠的,因爲有人可以更改文件的時間戳。但是,這對你的情況可能不是問題。 – Mick 2010-05-08 09:17:40

0

有如Kevin Jones所說的FileSystemWatcher服務可能是最實用的答案,但還有其他一些選擇。

如果您在Linux機器上安裝Samba,可以使用inotify觀察目錄。這當然假設你不介意分割你的平臺,但這就是通知的目的。

然後更正確,但你得到一個反超的相應較少的機會,如果你坐在監控的目錄,在它的文件20K它可能是時間去發展你的系統架構。不瞭解所有關於應用程序的更多信息,這聽起來像是一個消息隊列可能值得關注。

+0

其圖片管理型應用程序,以便結構僅僅是My Pictures文件夾,如thorrarin說,有這個程序,它可能只零星地運行服務運行似乎矯枉過正 – foz1284 2010-05-08 09:32:01

1

可以在某處onfile創建的最後一個時間戳寫的,很簡單,可以爲你工作。