gpt4 book ai didi

macos - 将 vRef 和 dirID(从 FSSpec)转换为 CFURL/NSURL

转载 作者:行者123 更新时间:2023-12-03 17:27:37 29 4
gpt4 key购买 nike

我正在将公司的一款应用程序迁移到 64 位环境,因此无法再访问 FSSpec 函数。

我们的文件格式中有一些数据结构,它们将旧 FSSpec 格式中的 vRefNum 和 dirID 保存到文件中...过去我们能够使用 Carbon 例程,从 FSSpec 到 FSRef,最后到 CFURL ,但 FSSpec 例程在 64 位中根本不可用,甚至 FSRef 例程从 10.9 起也已弃用。

在内部,我们使用 CFURL/NSURL,但仍然希望支持与这些旧文件格式之间的转换。有什么方法可以使用未弃用的(或至少 64 位友好的)例程在 vRefNum 和 dirID 之间往返于 CFURL 之间吗?

非常感谢。

最佳答案

Apple 不支持此功能,但您可以使用 volfs 文件系统来执行此操作,这是 Carbon 内部所做的。请参阅 Apple 提供的以下文档:

http://developer.apple.com/legacy/library/qa/qa2001/qa1113.html

这是一个根据卷 ID 和目录 ID 创建 CFURLRef 的函数:

CFURLRef CreateURLFromVolumeIDandDirectoryID(dev_t volumeID, SInt32 directoryID)
{
CFStringRef thePath = CFStringCreateWithFormat(kCFAllocatorDefault, NULL,
CFSTR("/.vol/%d/%d"), volumeID, (int) directoryID);

CFURLRef theURL = CFURLCreateWithFileSystemPath(kCFAllocatorDefault, thePath,
kCFURLPOSIXPathStyle, false);
CFRelease(thePath);
return theURL;
}

要使用 volfs,您还需要将卷引用号转换为卷 ID。这是一种方法:

dev_t ConvertVolumeRefNumtoVolumeID(FSVolumeRefNum refNum)
{
FSRef root;
OSErr error = FSGetVolumeInfo(refNum, 0, NULL, kFSVolInfoNone, NULL, NULL, &root);
if(error != noErr)
return 0;
UInt8 path[500];
OSStatus status = FSRefMakePath(&root, path, 500);
if(status != noErr)
return 0;
struct stat volStats;
int err = stat((const char*)path, &volStats);
if(err != 0)
return 0;

return volStats.st_dev;
}

根据链接的文档,应用程序永远不应该这样做,并且这可能会在任何 future 版本的 OS X 中停止工作。但是您问...

此外,在卸载然后重新安装卷时,不能保证卷引用号保持不变,因此如果将它们写入磁盘,则会遇到另一个问题。

关于macos - 将 vRef 和 dirID(从 FSSpec)转换为 CFURL/NSURL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25067954/

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