void UpdatePath (PathData pathData)
{
var newRoot = GetFilenameFromFd (pathData.Fd);
if (!newRoot.StartsWith (fullPathNoLastSlash)) { // moved outside of our watched path (so stop observing it)
RemoveTree (pathData);
return;
}
var toRename = new List<PathData> ();
var oldRoot = pathData.Path;
toRename.Add (pathData);
if (pathData.IsDirectory) { // anything under the directory must have their paths updated
var prefix = oldRoot + Path.DirectorySeparatorChar;
foreach (var path in pathsDict.Keys)
if (path.StartsWith (prefix))
toRename.Add (pathsDict [path]);
}
foreach (var renaming in toRename) {
var oldPath = renaming.Path;
var newPath = newRoot + oldPath.Substring (oldRoot.Length);
renaming.Path = newPath;
pathsDict.Remove (oldPath);
// destination may exist in our records from a Created event, take care of it
if (pathsDict.ContainsKey (newPath)) {
var conflict = pathsDict [newPath];
if (GetFilenameFromFd (renaming.Fd) == GetFilenameFromFd (conflict.Fd))
Remove (conflict);
else
UpdatePath (conflict);
}
pathsDict.Add (newPath, renaming);
}
PostEvent (FileAction.RenamedNewName, oldRoot, newRoot);
}