Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 使用NSURL设置并获取静态位_Objective C_Cocoa_Nsurl - Fatal编程技术网

Objective c 使用NSURL设置并获取静态位

Objective c 使用NSURL设置并获取静态位,objective-c,cocoa,nsurl,Objective C,Cocoa,Nsurl,我正在移植一些旧的FSRef代码以使用NSURL,NSFileManager和朋友。除了在文件上设置和获取Finderkisstationary位之外,其他一切都正常 有没有一种方法可以做到这一点而不必使用不推荐的FSRef方法?因此,经过一点研究,下面是设置和获取信纸位的答案: struct FileInfoBuf { u_int32_t info_length; union { u_int32_t padding[8]; struct

我正在移植一些旧的
FSRef
代码以使用
NSURL
NSFileManager
和朋友。除了在文件上设置和获取Finder
kisstationary
位之外,其他一切都正常


有没有一种方法可以做到这一点而不必使用不推荐的
FSRef
方法?

因此,经过一点研究,下面是设置和获取信纸位的答案:

struct FileInfoBuf
{
    u_int32_t info_length;
    union
    {
        u_int32_t padding[8];
        struct
        {
            u_int32_t type;
            u_int32_t creator;
            u_int16_t fdFlags;
            u_int16_t location;
            u_int32_t padding[4];
        }
        info;
    }
    data;
};

bool IsStationeryPad(const std::string& path)
{     
    attrlist attrList;
    FileInfoBuf fileInfo;

    attrList.bitmapcount = ATTR_BIT_MAP_COUNT;
    attrList.reserved = 0;
    attrList.commonattr = ATTR_CMN_FNDRINFO;
    attrList.volattr = 0;
    attrList.dirattr = 0;
    attrList.fileattr = 0;
    attrList.forkattr = 0;

    if (getattrlist(path.c_str(), &attrList, &fileInfo, sizeof(fileInfo), FSOPT_NOFOLLOW) == noErr)
    {
        return (CFSwapInt16BigToHost(fileInfo.data.info.fdFlags) & kIsStationery);
    }

    return false;
}

void SetStationeryPad(const std::string& path, bool isStationery)
{
    OSErr err = noErr;

    attrlist attrList;
    FileInfoBuf fileInfo;

    attrList.bitmapcount = ATTR_BIT_MAP_COUNT;
    attrList.reserved = 0;
    attrList.commonattr = ATTR_CMN_FNDRINFO;
    attrList.volattr = 0;
    attrList.dirattr = 0;
    attrList.fileattr = 0;
    attrList.forkattr = 0;

    err = getattrlist(path.c_str(), &attrList, &fileInfo, sizeof(fileInfo), FSOPT_NOFOLLOW);

    if (err == noErr)
    {
        fileInfo.data.info.fdFlags |= CFSwapInt16HostToBig(kIsStationery);

        setattrlist(path.c_str(), &attrList, &fileInfo.data, sizeof(fileInfo.data), FSOPT_NOFOLLOW);
    }
}
请注意,此代码中没有真正的错误检查。此外,应用程序可能不应该设置此位,这实际上是用户的决定,应该通过Finder进行控制