private void ProcessFileCreate(PInvokeWin32.USN_RECORD usn, string volume, MFTSearcherCache db) { USNRecord record = USNRecord.ParseUSN(volume, usn); db.AddRecord(volume, record); Debug.WriteLine(string.Format(">>>> NewFile: {0}", record.FullPath)); if (RecordAddedEvent != null) { RecordAddedEvent(record); } }
public void AddRecord(string volume, USNRecord record) { EnsureVolumeExistInHashTable(volume); if (!VolumeRecords[volume].ContainsKey(record.FRN)) { lock (locker) { VolumeRecords[volume].Add(record.FRN, record); } } }
public USNRecord FindByFrn(string volume, ulong frn) { if ((!VolumeRecords.ContainsKey(volume))) { throw new Exception(string.Format("DB not contain the volume: {0}", volume)); } USNRecord result = null; VolumeRecords[volume].TryGetValue(frn, out result); return(result); }
internal static void FillPath(string volume, USNRecord record, MFTSearcherCache db) { if (record == null) { return; } var fdSource = db.GetVolumeRecords(volume); string fullpath = record.Name; FindRecordPath(record, ref fullpath, fdSource); record.FullPath = fullpath; }
private static void FindRecordPath(USNRecord curRecord, ref string fullpath, Dictionary <ulong, USNRecord> fdSource) { if (curRecord.IsVolumeRoot) { return; } USNRecord nextRecord = null; if (!fdSource.TryGetValue(curRecord.ParentFrn, out nextRecord)) { return; } fullpath = string.Format("{0}{1}{2}", nextRecord.Name, Path.DirectorySeparatorChar, fullpath); FindRecordPath(nextRecord, ref fullpath, fdSource); }
private void ProcessRenameNewName(PInvokeWin32.USN_RECORD usn, string volume, MFTSearcherCache db) { USNRecord newRecord = USNRecord.ParseUSN(volume, usn); db.UpdateRecord(volume, newRecord); var oldRecord = db.FindByFrn(volume, usn.FRN); if (oldRecord != null) { Debug.WriteLine(string.Format(">>>> RenameFile {0} to {1}", oldRecord.FullPath, newRecord.FullPath)); if (RecordRenameEvent != null) { RecordRenameEvent(oldRecord, newRecord); } } }
private bool RealUpdateRecord(string volume, Dictionary <string, Dictionary <ulong, USNRecord> > source, USNRecord record) { if (source.ContainsKey(volume) && source[volume].ContainsKey(record.FRN)) { lock (locker) { source[volume][record.FRN] = record; } return(true); } else { return(false); } }
public void UpdateRecord(string volume, USNRecord record) { RealUpdateRecord(volume, VolumeRecords, record); }