Browse Source

Fix up directory watchers

ebr11 Eric Reed spam 12 years ago
parent
commit
da618f13e2

+ 4 - 2
MediaBrowser.Common/Extensions/BaseExtensions.cs

@@ -28,11 +28,13 @@ namespace MediaBrowser.Common.Extensions
         /// <returns></returns>
         public static bool ContainsParentFolder(this List<string> lst, string path)
         {
+            path = path.TrimEnd('\\');
             foreach (var str in lst)
             {
                 //this should be a little quicker than examining each actual parent folder...
-                if (path.Equals(str,StringComparison.OrdinalIgnoreCase) 
-                    || (path.StartsWith(str, StringComparison.OrdinalIgnoreCase) && path[str.Length-1] == '\\')) return true;
+                var compare = str.TrimEnd('\\');
+                if (path.Equals(compare,StringComparison.OrdinalIgnoreCase) 
+                    || (path.StartsWith(compare, StringComparison.OrdinalIgnoreCase) && path[compare.Length] == '\\')) return true;
             }
             return false;
         }

+ 13 - 6
MediaBrowser.Controller/IO/DirectoryWatchers.cs

@@ -62,11 +62,9 @@ namespace MediaBrowser.Controller.IO
             Logger.LogDebugInfo("****** Watcher sees change of type " + e.ChangeType.ToString() + " to " + e.FullPath);
             lock (affectedPaths)
             {
-                if (!affectedPaths.Contains(e.FullPath))
-                {
-                    Logger.LogDebugInfo("****** Adding " + e.FullPath + " to affected paths.");
-                    affectedPaths.Add(e.FullPath);
-                }
+                //Since we're watching created, deleted and renamed we always want the parent of the item to be the affected path
+                var affectedPath = Path.GetDirectoryName(e.FullPath);
+                
                 if (e.ChangeType == WatcherChangeTypes.Renamed)
                 {
                     var renamedArgs = e as RenamedEventArgs;
@@ -76,6 +74,15 @@ namespace MediaBrowser.Controller.IO
                     affectedPaths.Remove(renamedArgs.OldFullPath);
                     }
                 }
+
+                //If anything underneath this path was already marked as affected - remove it as it will now get captured by this one
+                affectedPaths.RemoveAll(p => p.StartsWith(e.FullPath, StringComparison.OrdinalIgnoreCase));
+                
+                if (!affectedPaths.ContainsParentFolder(affectedPath))
+                {
+                    Logger.LogDebugInfo("****** Adding " + affectedPath + " to affected paths.");
+                    affectedPaths.Add(affectedPath);
+                }
             }
 
             if (updateTimer == null)
@@ -125,7 +132,7 @@ namespace MediaBrowser.Controller.IO
             }
 
             foreach (var p in paths) Logger.LogDebugInfo("*********  "+ p + " reports change.");
-            foreach (var i in itemsToRefresh) Logger.LogDebugInfo("*********  "+i.Name + " will be refreshed.");
+            foreach (var i in itemsToRefresh) Logger.LogDebugInfo("*********  "+i.Name + " ("+ i.Path + ") will be refreshed.");
             return Task.WhenAll(itemsToRefresh.Select(i => i.ChangedExternally()));
         }