如何使用objective-c在Finder中使文件不可见

时间:2010-06-02 15:07:41

标签: objective-c cocoa macos file

如果可能的话,我需要使用objective-c或使用C调用在finder和spotlight中隐藏文件。

由于

3 个答案:

答案 0 :(得分:6)

您可以使用:

chflags("/path/to/file", UF_HIDDEN);

隐藏任何文件。

有关详情,请参阅man chflags(2)

答案 1 :(得分:4)

您可以通过某些C调用设置invisibility属性。这是非常原始的代码,仅适用于某些文件系统,并且缺少错误检查。

#include <assert.h>
#include <stdio.h>
#include <stddef.h>
#include <string.h>
#include <sys/attr.h>
#include <sys/errno.h>
#include <unistd.h>
#include <sys/vnode.h>

typedef struct attrlist attrlist_t;

struct FInfoAttrBuf {
    u_int32_t length;
    fsobj_type_t objType;

    union {
        char rawBytes[32];

        struct {
            FileInfo info;
            ExtendedFileInfo extInfo;
        } file;

        struct {
            FolderInfo info;
            ExtendedFolderInfo extInfo;
        } folder;
    } finderInfo;
};
typedef struct FInfoAttrBuf FInfoAttrBuf;


static int SetFileInvisibility(const char *path, int isInvisible) {
    attrlist_t attrList;
    FInfoAttrBuf attrBuf;

    memset(&attrList, 0, sizeof(attrList));
    attrList.bitmapcount = ATTR_BIT_MAP_COUNT;
    attrList.commonattr  = ATTR_CMN_OBJTYPE | ATTR_CMN_FNDRINFO;

    int err = getattrlist(path, &attrList, &attrBuf, sizeof(attrBuf), 0);
    if (err != 0)
        return errno;

    // attrBuf.objType = (VREG | VDIR), inconsequential for invisibility

    UInt16 flags = CFSwapInt16BigToHost(attrBuf.finderInfo.file.info.finderFlags);

    if (isInvisible)
        flags |= kIsInvisible;
    else
        flags &= (~kIsInvisible);

    attrBuf.finderInfo.file.info.finderFlags = CFSwapInt16HostToBig(flags);

    attrList.commonattr = ATTR_CMN_FNDRINFO;
    err = setattrlist(path, &attrList, attrBuf.finderInfo.rawBytes, sizeof(attrBuf.finderInfo.rawBytes), 0);

    return err;
}

或者你可以浏览NSURL,如果你可以定位Snow Leopard,它会抽象出每个文件系统如何处理和处理扩展属性。

NSURL *url = [NSURL fileURLWithPath:path];
[url setResourceValue:[NSNumber numberWithBool:YES] forKey:NSURLIsHiddenKey error:NULL];

答案 2 :(得分:3)

(编辑:前导点似乎没有让它远离mdfind)

以“。”开头的文件默认情况下将隐藏在Finder中。用户可以使用defaults键覆盖它,但这通常会照顾它。

对于Spotlight,请参阅TA24975,它更详细地解释了Lyndsey提到的内容。您可能需要结合这些方法,具体取决于您是否试图避免mdfind -name将其捡起来。