> sre 15.05.2019, at 14.24, Thomas Tempelmann wrote:
> 
> What you suggest should cover the situation of any path component along the 
> full file path being changed, right? I don’t know if in such case resolving 
> url’s path is more efficient than comparing strings and asking if an event 
> path(s) is a prefix of a dirname(watchedpath).
> 
> If you use fileRef URLs, then even if the file gets moved, you can still 
> access it. If you use NSURLs based on paths, once the file has been moved, 
> you cannot find it any more because it's not at the path where the URL looks 
> for it.

I understand all that, I was just discussing why I’d use that approach as well. 
To make things more clear, and perhaps it may be interested for others with 
similar usage/problems, I’ll give an overview what happens if you monitor 
changes of a particular file. Let’s say the full file path is 
“/Folder1/Folder2/Folder3/File4” and an event stream is created with 
kFSEventStreamCreateFlagFileEvents and kFSEventStreamCreateFlagWatchRoot flags.

Non-sandboxed application:

Case 1: “File4” created in “/Folder1/Folder2/Folder3”:
        — eventPath[0] = “/Folder1/Folder2/Folder3/File4”,  eventFlags[0] 
contain (kFSEventStreamEventFlagItemIsFile & kFSEventStreamEventFlagItemCreated)

Case 2: “File4” modified in “/Folder1/Folder2/Folder3”:
        — eventPath[0] = “/Folder1/Folder2/Folder3/File4”,  eventFlags[0] 
contain (kFSEventStreamEventFlagItemIsFile & 
kFSEventStreamEventFlagItemModified)

Case 3: “File4” deleted in “/Folder1/Folder2/Folder3”:
        — eventPath[0] = “/Folder1/Folder2/Folder3/File4”,  eventFlags[0] 
contain (kFSEventStreamEventFlagItemIsFile & kFSEventStreamEventFlagItemRemoved)

Case 4: “File4” renamed to “File5" in “/Folder1/Folder2/Folder3”:
        — eventPath[0] = “/Folder1/Folder2/Folder3/File4”,  eventFlags[0] 
contain (kFSEventStreamEventFlagItemIsFile & kFSEventStreamEventFlagItemRenamed)
        — eventPath[1] = “/Folder1/Folder2/Folder3/File5”,  eventFlags[1] 
contain (kFSEventStreamEventFlagItemIsFile & kFSEventStreamEventFlagItemRenamed)

Case 5: “File4” moved (renamed) outside of "/Folder1/Folder2/Folder3”:
        — eventPath[0] = “/Folder1/Folder2/Folder3/File4”,  eventFlags[0] 
contain (kFSEventStreamEventFlagItemIsFile & kFSEventStreamEventFlagItemRenamed)

Case 6: Any folder along the full path “/Folder1/Folder2/Folder3/File4” (e.g. 
“Folder2”) is renamed:
        — eventPath[0] = “/Folder1/Folder2/Folder3/File4”, eventFlags[0] 
contain ONLY kFSEventStreamEventFlagRootChanged

For a sandboxed application, everything is the same, except that the case 6 is 
not detected at all, the event stream stays silent. So, in order to catch the 
case 6, I can watch "/Folder1/Folder2/Folder3” instead, but that would catch 
only renaming of “Folder3”, hence to catch renaming of “Folder2” I have to 
watch “/Folder1/Folder2” and subsequently we come to that I have to watch “/“ 
and filter event paths myself. So, for changes in cases 1 - 5, I have to do 
filtering myself with condition:

for (each i)
{
        if ([watchedPath isEqualToString:eventPath[i]])
        {
                // do process…
                break
        }
}


For changes in case 6 I can do filtering myself with condition:

for (each i)
{
        if ([[watchedPath stringByDeletingLastPathComponent] 
hasPrefix:eventPath[i]] && (eventFlags[i] & (kFSEventStreamEventFlagItemIsDir | 
kFSEventStreamEventFlagItemRenamed)))
        {
                // do process…
                break
        }
}


… or take the approach you suggest:

newPath = [fileReferenceURL path];

if (![newPath isEqualToString:oldPath])
{
        oldPath = newPath;
        // do process…
}


… and I was just wondering which one would be more efficient. That also depends 
on a number of changes on the filesystem, so it’s not deterministic.

-- Dragan
 _______________________________________________
Do not post admin requests to the list. They will be ignored.
Filesystem-dev mailing list      (Filesystem-dev@lists.apple.com)
Help/Unsubscribe/Update your Subscription:
https://lists.apple.com/mailman/options/filesystem-dev/archive%40mail-archive.com

This email sent to arch...@mail-archive.com

Reply via email to