這部分取決於兩個卷如何重複;如果它們是從文件系統的角度來看是「真實」的副本(例如,卷影副本或其他塊級副本),您可以就USN做一些棘手的小事情,這是其他人建議您研究的一般技術。例如,您可能想要查看像FSCTL_READ_FILE_USN_DATA這樣的API。該API可讓您比較文件的兩個不同副本(同樣,假設它們是具有相同文件,並且具有與塊級備份相同的文件參考號)。如果你想在很大程度上無國籍,這個和類似的API會在這裏幫助你很多。我的算法將是這個樣子:
foreach(file in backup_volume) {
file_still_exists = try_open_by_id(modified_volume)
if (file_still_exists) {
usn_result = compare_usn_values_of_files(file, file_in_modified_volume)
if (usn_result == equal_to) {
// file hasn't changed at all
} else {
// file has changed (somehow)
}
} else {
// file was deleted (possibly deleted and recreated)
}
}
// we still don't know about files new in modified_volume
所有這麼說,我的經歷使我相信,這將是比我現成的,袖口的說明提示更加複雜。不過,這可能是一個很好的起點。
如果卷不是彼此的塊級副本,那麼比較USN號碼和文件ID(如果不是不可能的話)將是非常困難的。相反,如果不打開每個文件都不是不可能的,那麼很可能會按文件名進行操作(時間可以通過應用程序進行修改,大小和時間可以在findfirst/next查詢中過時,而您必須處理已刪除然後重新創建的案例,重命名案例等)。
因此,知道你對環境有多少控制是非常重要的。
爲了獲得更有用的答案,您應該在您的工具應運行的平臺下添加。 POSIX,win32還是別的?不同的平臺具有不同的文件系統語義。 – maxschlepzig 2010-08-28 18:16:01
對不起,現在添加了win32標籤。謝謝 – lalli 2010-08-28 18:22:36
耗時? *你如何*通過卷遞歸和比較事物?我希望不是手動的。你熟悉腳本語言嗎? Perl的?校驗? – Beta 2010-08-28 18:25:45