Как сделать файл невидимым в Finder с помощью target-c - PullRequest
4 голосов
/ 02 июня 2010

Мне нужно скрыть файл в видоискателе, а также в центре внимания, если это возможно, используя target-c или вызовы C.

Спасибо

Ответы [ 3 ]

6 голосов
/ 29 сентября 2012

Вы можете использовать:

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

чтобы скрыть любой файл.

Подробнее см. man chflags (2) .

4 голосов
/ 15 июня 2010

Вы можете установить атрибут невидимости с помощью некоторых вызовов C. Это довольно сырой код, который работает только на некоторых файловых системах и в котором отсутствует проверка ошибок.

#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];
3 голосов
/ 02 июня 2010

(РЕДАКТИРОВАТЬ: ведущая точка, кажется, не удерживает ее от mdfind)

Файлы, начинающиеся с "." по умолчанию будет скрыт в Finder. Пользователи могут переопределить это с помощью клавиши defaults, но это позаботится об этом в целом.

Прожектор см. В TA24975 , в котором более подробно объясняется, что упоминает Линдси. Возможно, вам нужно объединить подходы, в зависимости от того, пытаетесь ли вы mdfind -name не поднять его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...