public FileChangeTrackingSet.EnumerationResult TrackDir(string dir) { if (m_changeTracker == null) { StartTracking(); } var result = m_changeTracker.TryEnumerateDirectoryAndTrackMembership(dir, (_, __) => { }); XAssert.PossiblySucceeded(result); return(result.Result); }
/// <summary> /// Combined operation of opening and tracking a directory (or its absence), enumerating it, and then tracking changes to that enumeration result (its membership). /// The membership of the directory will be invalidated if a name is added or removed directly inside the directory (i.e., when <c>FindFirstFile</c> /// and <c>FindNextFile</c> would see a different set of names). /// </summary> public Possible <FileChangeTrackingSet.EnumerationResult> TryEnumerateDirectoryAndTrackMembership(string path, Action <string, FileAttributes> handleEntry) { Contract.Requires(!string.IsNullOrWhiteSpace(path)); Contract.Requires(handleEntry != null); if (IsDisabledOrNullTrackingSet) { var possibleFingerprintResult = DirectoryMembershipTrackingFingerprinter.ComputeFingerprint(path, handleEntry); if (!possibleFingerprintResult.Succeeded) { return(possibleFingerprintResult.Failure); } return(new FileChangeTrackingSet.EnumerationResult( possibleFingerprintResult.Result.Fingerprint, possibleFingerprintResult.Result.PathExistence, new Failure <string>("Tracking set is disabled"))); } // Note that we still attempt to enumerate-and-track even if this tracker is already disabled (but was created with a tracking set). We need the result if possible // (and if additional tracking succeeds while disabled, there's no harm). Possible <FileChangeTrackingSet.EnumerationResult> possibleEnumerationResult = m_changeTrackingSet.TryEnumerateDirectoryAndTrackMembership( path, handleEntry); if (!possibleEnumerationResult.Succeeded) { DisableTracking(path, possibleEnumerationResult.Failure); return(possibleEnumerationResult.Failure); } return(possibleEnumerationResult); }