Fixed possible race condition.

This commit is contained in:
Michael Bucari-Tovo 2021-07-27 10:26:15 -06:00
parent 406aea6ead
commit f06b04ede4

View File

@ -76,43 +76,40 @@ namespace FileManager
private void UpdateLocalCache(FileSystemEventArgs change) private void UpdateLocalCache(FileSystemEventArgs change)
{ {
if (change.ChangeType == WatcherChangeTypes.Deleted) lock (fsCache)
{ {
RemovePath(change.FullPath); if (change.ChangeType == WatcherChangeTypes.Deleted)
} {
else if (change.ChangeType == WatcherChangeTypes.Created) RemovePath(change.FullPath);
{ }
AddPath(change.FullPath); else if (change.ChangeType == WatcherChangeTypes.Created)
} {
else if (change.ChangeType == WatcherChangeTypes.Renamed) AddPath(change.FullPath);
{ }
var renameChange = change as RenamedEventArgs; else if (change.ChangeType == WatcherChangeTypes.Renamed)
{
var renameChange = change as RenamedEventArgs;
RemovePath(renameChange.OldFullPath); RemovePath(renameChange.OldFullPath);
AddPath(renameChange.FullPath); AddPath(renameChange.FullPath);
}
} }
} }
private void RemovePath(string path) private void RemovePath(string path)
{ {
lock (fsCache) var pathsToRemove = fsCache.Where(p => p.StartsWith(path)).ToArray();
{
var pathsToRemove = fsCache.Where(p => p.StartsWith(path)).ToArray();
foreach (var p in pathsToRemove) foreach (var p in pathsToRemove)
fsCache.Remove(p); fsCache.Remove(p);
}
} }
private void AddPath(string path) private void AddPath(string path)
{ {
lock (fsCache) if (File.GetAttributes(path).HasFlag(FileAttributes.Directory))
{ fsCache.AddRange(Directory.EnumerateFiles(path, SearchPattern, SearchOption));
if (File.GetAttributes(path).HasFlag(FileAttributes.Directory)) else
fsCache.AddRange(Directory.EnumerateFiles(path, SearchPattern, SearchOption)); fsCache.Add(path);
else
fsCache.Add(path);
}
} }
#endregion #endregion