public void Scan() { USN firstUsn = this.FromUsn; do { var usnRecords = this.usnIo.FileSystemReadUsnJournal(UsnJournalReasonMask.All, firstUsn); foreach (USN_RECORD_V2 usnRecord in usnRecords) { var fileDescriptor = new FILE_ID_DESCRIPTOR { dwSize = 100, FileReferenceNumber = usnRecord.FileReferenceNumber, type = FILE_ID_TYPE.FileIdType }; var fileHandle = Kernel32.OpenFileById(this.volumeHandle, ref fileDescriptor, FileAccess.Read, FileShare.ReadWrite, IntPtr.Zero, FileAttributes.Normal); if (fileHandle.IsInvalid) { continue; } var filePath = Kernel32.GetFinalPathNameByHandle(fileHandle); var reason = Convert(usnRecord.Reason); if (this.AcceptFile(filePath, usnRecord.FileName) && this.Filter(filePath, reason)) { this.recordListener.Listen(filePath, reason); } } if (usnRecords.Length == 0) { break; } firstUsn.Usn = usnRecords.Last().Usn.Usn + 1; } while (true); this.ScanLastUsn = firstUsn.Usn; }
public static extern IntPtr OpenFileById(IntPtr hFile, FILE_ID_DESCRIPTOR lpFileID, uint dwDesiredAccess, uint dwShareMode, uint dwFlagas);