> Unfortunately you probably can’t do any better than that, since there’s no cheap way to find out if another process has the file open.
proc_listpidspath() is meant for this, but it is indeed quite expensive. In my testing, it takes about a second to complete this call; furthermore, its status as a supported API is unclear. Nonetheless, here's some somewhat-tested code of how to use it: ============================== #import <libproc.h> - (NSSet *)pidsAccessingPath: (NSString *)path { const char *pathFileSystemRepresentation = nil; int listpidspathResult = 0; size_t pidsSize = 0; pid_t *pids = nil; NSUInteger pidsCount = 0, i = 0; NSMutableSet *result = nil; NSParameterAssert(path && [path length]); pathFileSystemRepresentation = [path GCSafeFileSystemRepresentation]; listpidspathResult = proc_listpidspath(PROC_ALL_PIDS, 0, pathFileSystemRepresentation, PROC_LISTPIDSPATH_EXCLUDE_EVTONLY, nil, 0); ALAssertOrPerform(listpidspathResult >= 0, goto cleanup); pidsSize = (listpidspathResult ? listpidspathResult : 1); pids = malloc(pidsSize); ALAssertOrPerform(pids, goto cleanup); listpidspathResult = proc_listpidspath(PROC_ALL_PIDS, 0, pathFileSystemRepresentation, PROC_LISTPIDSPATH_EXCLUDE_EVTONLY, pids, pidsSize); ALAssertOrPerform(listpidspathResult >= 0, goto cleanup); pidsCount = (listpidspathResult / sizeof(*pids)); result = [NSMutableSet set]; for (i = 0; i < pidsCount; i++) [result addObject: [NSNumber numberWithInt: pids[i]]]; cleanup: { if (pids) free(pids), pids = nil; } return result; } _______________________________________________ Cocoa-dev mailing list (Cocoa-dev@lists.apple.com) Please do not post admin requests or moderator comments to the list. Contact the moderators at cocoa-dev-admins(at)lists.apple.com Help/Unsubscribe/Update your Subscription: http://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com This email sent to arch...@mail-archive.com