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
和朋友。除了在文件上设置和获取Finderkisstationary
位之外,其他一切都正常
有没有一种方法可以做到这一点而不必使用不推荐的
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进行控制