gpt4 book ai didi

objective-c - 使用 NSURL 设置和获取 kIsStationary 位

转载 作者:行者123 更新时间:2023-12-03 17:10:21 25 4
gpt4 key购买 nike

我正在移植一些旧的 FSRef 代码以使用 NSURLNSFileManager 等。除了在文件上设置和获取 Finder kIsStationery 位之外,一切正常。

有没有一种方法可以做到这一点,而不需要依赖已弃用的 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 进行控制。

关于objective-c - 使用 NSURL 设置和获取 kIsStationary 位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34462544/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com