如何检查文件是否在Cocoa中被锁定?

时间:2012-07-31 10:12:27

标签: objective-c macos cocoa nsfilemanager

是否有任何API可以检查文件是否已被锁定?我无法在NSFileManager类中找到任何API。让我知道是否有任何API来检查文件的锁定。

我找到了与文件锁相关的以下链接

http://lists.apple.com/archives/cocoa-dev/2006/Nov/msg01399.html

我可以调用 - isWritableFileAtPath:on file。有没有其他方法可以找到文件是否被锁定?

3 个答案:

答案 0 :(得分:10)

以下代码为我工作。

  NSError * error;
            NSDictionary *attributes =  [[NSFileManager defaultManager] attributesOfItemAtPath:filePath error:&error];
            BOOL isLocked = [[attributes objectForKey:@"NSFileImmutable"] boolValue];

            if(isLocked)
            {
              NSLog(@"File is locked");
            }

答案 1 :(得分:3)

如果需要,还可以使用POSIX C函数确定不可变标志(OS X'文件锁定')。不可变属性不是unix术语中的锁,而是文件标志。它可以使用stat函数获得:

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

参考:https://developer.apple.com/library/mac/#documentation/Darwin/Reference/ManPages/man2/stat.2.html

可以使用chflags函数设置不可变标志:

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

参考:https://developer.apple.com/library/mac/#documentation/Darwin/Reference/ManPages/man2/chflags.2.html

答案 2 :(得分:2)

我真的不知道这个问题的答案,因为我不知道OS X如何实现其锁定机制。

可能使用flock() manpage中记录的POSIX顾问锁定,如果我是你,我会写一个 10 31- C中的线路测试程序,用于显示fcntl()manpage)对您在Finder中发出的咨询锁的看法。

像(未经测试)的东西:

#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;
}