> 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

Reply via email to