2010-09-30 60 views
5

我有一個實用程序,它處理目錄中的一組文件 - 這個過程相對較慢(並且有很多文件)和所以我試圖通過僅處理具有晚於最後處理日期的「最後修改」的文件來優化處理。Windows:如何確定一個文件自給定日期以來是否已被修改

通常這個效果很好,但是我發現複製文件不會改變最後修改日期,所以有各種複製文件的過程中會跳過某些被更改的文件的情況,例如:

  1. 用戶在9:00處理目錄。
  2. 的文件,然後從該目錄複製和修改,使之具有9:30
  3. 最後修改日期的目錄,然後在10:00
  4. 修改後的文件再次進行處理,然後複製回在10:30
  5. 目錄最後的目錄是在11:00

由於給定文件的修改日期是9點30分再次處理,並且目錄在10:00最後處理的是該文件當它不應該跳過時跳過。

不幸的是,在某些情況下(比如在與源代碼控制等的協作環境中),上述情況經常發生得太頻繁。顯然,我的邏輯是有缺陷的 - 我真正需要的是「最後修改或複製」日期。這樣的事情存在嗎?

如果沒有,那麼有沒有另一種方法來快速判斷一個給定的文件是否有變化,並且具有合理的可靠性?

回答

4

你有沒有想過在文件上運行MD5校驗和並存儲它們以便進行比較?如果你總是處理某個目錄,這可能是可行的。

+0

是的,但是這是我的備用解決方案 - 我希望有一種方法可以確定給定的文件是否已更改(具有合理的可靠性),而無需讀取文件本身。 – Justin 2010-09-30 06:33:40

9

你可能想看看使用FileSystemWatcher類。這個類允許你監視一個目錄的變化,並在修改某些事件時觸發一個事件。您的代碼可以處理事件並處理文件。

從MSDN:

// Create a new FileSystemWatcher and set its properties. 
FileSystemWatcher watcher = new FileSystemWatcher(); 
watcher.Path = args[1]; 
/* Watch for changes in LastAccess and LastWrite times, and 
    the renaming of files or directories. */ 
watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite 
    | NotifyFilters.FileName | NotifyFilters.DirectoryName; 
// Only watch text files. 
watcher.Filter = "*.txt"; 

// Add event handlers. 
watcher.Changed += new FileSystemEventHandler(OnChanged); 
watcher.Created += new FileSystemEventHandler(OnChanged); 
watcher.Deleted += new FileSystemEventHandler(OnChanged); 
watcher.Renamed += new RenamedEventHandler(OnRenamed); 
+0

麻煩的是,這個過程是一個批處理過程,所以不會一直運行。事實上,如果有問題的文件夾是映射的網絡驅動器,那麼*計算機*可能甚至沒有運行。 – Justin 2010-09-30 06:43:15

+0

我知道經常掃描一個目錄並不是最好的解決方案。很好的答案! – Nolonar 2014-01-24 12:13:15

0

你有沒有考慮添加一個進程看你的目錄呢?使用FileSystemWatcher?然後,您將從使用批處理流程和實時系統來監控文件。

3

您可以使用FileInfo類獲取所需的更改信息(您可能已經在使用)。您需要檢查文件的兩個屬性,分別是LastWriteTimeCreationTime。如果它們中的任何一個比您上次處理日期更高,則需要複製該文件。這是一個普遍的誤解,認爲CreationTime總是小於LastWriteTime。不是。如果一個文件被複制到另一個文件,新文件保留源的LastWriteTime,但CreationTime將是複製的時間。

+1

啊 - 太近了!這幾乎可以工作,但不幸的是,如果你覆蓋了一個文件,那麼看起來創建時間就像創建* original *文件的時間一樣。 – Justin 2010-09-30 07:07:45

+0

你用什麼方法覆蓋文件?因爲如果文件被覆蓋,其CreationTime將與之前相同,但它的'LastWriteTime'將會改變。其中一個屬性必須改變。 – Yogesh 2010-09-30 07:11:47

+0

如果使用cmd.exe中的「複製」,則將目標文件「LastWriteTime」設置爲源文件LWT,而不是更新爲當前時間。 – snemarch 2010-09-30 08:03:41

0

正如您所觀察到的,將文件複製到現有目標文件會保留現有文件的CreationTime,並將LastWriteTime設置爲源文件的LastWriteTime,而不是執行復制時的當前系統時間。兩種可能的解決方案:

  1. 做一個刪除和複製,確保目標CreationTime將系統的當前時間。
  2. 檢查文件的A rchived屬性以及在處理時清除它。當複製source-> dest時,dest + A屬性將被設置。
相關問題