How to check whether a file is locked in Cocoa?

后端 未结 3 1517
南方客
南方客 2021-02-06 15:47

Is there any API to check whether a file is a locked? I am not able to find any API in the NSFileManager class.Let me know if there is any API to check the lock of

相关标签:
3条回答
  • 2021-02-06 16:19

    If necessary, the immutable flag (OS X 'file locked') can also be determined with POSIX C functions. The immutable property is not a lock in unix terms but a file flag. It can be obtained with the stat function:

    struct stat buf;
    stat("my/file/path", &buf);
    if (0 != (buf.st_flags & UF_IMMUTABLE)) {
         //is immutable
    }
    

    For reference see: https://developer.apple.com/library/mac/#documentation/Darwin/Reference/ManPages/man2/stat.2.html

    The immutable flag can be set with the chflags function:

    chflags("my/file/path", UF_IMMUTABLE);
    

    For reference see: https://developer.apple.com/library/mac/#documentation/Darwin/Reference/ManPages/man2/chflags.2.html

    0 讨论(0)
  • 2021-02-06 16:25

    Following Code worked for me.

    NSError * error;
    NSDictionary *attributes = [[NSFileManager defaultManager] attributesOfItemAtPath:filePath error:&error];
    BOOL isLocked = [[attributes objectForKey:NSFileImmutable] boolValue];
                
    if (isLocked) {
        NSLog(@"File is locked");
    }
    
    0 讨论(0)
  • 2021-02-06 16:32

    I don't really know the answer to this question as I don't know how OS X implements its locking mechanism.

    It might use the POSIX advisory locking as documented in the flock() manpage and if I were you I would write a 10 31-line test program in C to show what fcntl() (manpage) thinks about the advisory lock you have made from within Finder.

    Something like (untested):

    #include <fcntl.h>
    #include <errno.h>
    #include <stdio.h>
    
    int main(int argc, const char **argv)
    {
        for (int i = 1; i < argc; i++)
        {
            const char *filename = argv[i];
            int fd = open(filename, O_RDONLY);
            if (fd >= 0)
            {
                struct flock flock;
                if (fcntl(fd, F_GETLK, &flock) < 0)
                {
                    fprintf(stderr, "Failed to get lock info for '%s': %s\n", filename, strerror(errno));
                }
                else
                {
                    // Possibly print out other members of flock as well...
                    printf("l_type=%d\n", (int)flock.l_type);
                }
                close(fd);
            }
            else
            {
                fprintf(stderr, "Failed to open '%s': %s\n", filename, strerror(errno));
            }
        }
        return 0;
    }
    
    0 讨论(0)
提交回复
热议问题