Пример #1
0
        public FileChangeTrackingSet.EnumerationResult TrackDir(string dir)
        {
            if (m_changeTracker == null)
            {
                StartTracking();
            }

            var result = m_changeTracker.TryEnumerateDirectoryAndTrackMembership(dir, (_, __) => { });

            XAssert.PossiblySucceeded(result);
            return(result.Result);
        }
Пример #2
0
        /// <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);
        }