Futurebasic/Language/cfurlref
通过 URL 访问文件和资源。
CFURL 提供了创建、解析和取消引用 URL 字符串的功能。CFURL 对需要使用 URL 访问资源(包括本地文件)的应用程序很有用,因此在这里包含它。
苹果工程师让 CFURL 与其 Cocoa Foundation 的对应项 NSURL 实现“无缝桥接”。对于 FB 和 FBtoC 程序员来说,这是一个好消息,因为网上有很多可移植到我们的 Carbon 代码中的 Cocoa 代码片段。
一个 CFURL 对象由两个部分组成
1.) 一个基本 URL,它可以为空,在 C 中为 0 或 NULL,以及
2.) 一个相对于基本 URL 解析的字符串。
一个字符串完全解析而没有基本 URL 的 CFURL 对象被认为是绝对的;所有其他都被认为是相对的。
例如,假设您的 FutureBASIC 应用程序存储在您的 OS X Applications 文件夹中,在一个名为“FutureBASIC 4.1.1”的文件夹中,其可执行文件的绝对 CFURL 路径将是
/Applications/FutureBASIC\ 4.1.1/FutureBASIC.app/Contents/MacOS/FutureBASIC
此对象已完全解析,因为它是在其所在的卷的根级别上的完整路径。
另一方面,一个未完全解析的相对路径将是
/FutureBASIC.app/Contents/MacOS/FutureBASIC
此相对路径定义了 FutueBASIC 可执行文件在 FutureBASIC.app 包中的位置,但没有指示 FutureBASIC 应用程序位于何处。
CFURL 对象由 CFURLRef 定义。与其他 Core Foundation 对象引用一样,CFURLRef 是 不透明类型。它们的内部组成没有在 Apple 文档中记录,并且它们通过 Toolbox 函数访问和操作。
在 CFURL 及其关联的 CRURLRef 发挥作用的领域中,有一个是 在 OS X 包中定位资源。
这个例子,发布在 FutureBASIC 邮件列表 上——该邮件列表是 FB 和 FBtoC 用户的宝贵资源——演示了一种技术,用于获取到包内 ReadMe 文本文件的 CFURLRef,并将 CFURL 传递给 OS X 系统 Launch Services,Launch Services 接着为用户打开文件以供在系统的默认文本应用程序中阅读。
include "Tlbx LSOpen.incl" include "Tlbx CFBundle.incl" include "Subs DEF USR CFPrefs.incl" toolbox fn CFBundleCopyResourceURL( CFBundleRef bundle,¬ CFStringRef resourceName,¬ CFStringRef resourceType,¬ CFStringRef subDirName ) = CFBundleRef local fn OpenReadMe( readMeName as Str255 ) dim as CFBundleRef bundle dim as CFURLRef url bundle = fn CFBundleGetMainBundle long if( bundle ) url = fn CFBundleCopyResourceURL( bundle, fn CFSTR( readMeName ), 0, 0 ) long if( url ) call LSOpenCFURLRef( url, #0 ) end if end if CFRelease( url ) end fn fn OpenReadMe( "ReadMe.txt" ) do handleevents until gFBQuit
这里还有另一个函数,它使用 CFURLRef 为 QuickTime 识别的几种类型的图像文件(JPEG、PNG、TIFF 等)之一创建图像引用——同样位于捆绑应用程序的资源文件夹中
local mode local fn CreateCGImageFromBundleResource( fileName as CFStringRef ) dim as CFURLRef url dim as CGImageRef imageRef dim as CGDataProviderRef sourceRef image = 0 url = fn CFBundleCopyResourceURL( fn CFBundleGetMainBundle(), fileName, 0, 0 ) long if ( url ) sourceRef = fn CGImageSourceCreateWithURL( url, 0 ) long if ( sourceRef ) imageRef = fn CGImageSourceCreateImageAtIndex( sourceRef, 0, 0 ) end if end if CFRelease( url ) CFRelease( sourceRef ) end fn = imageRef
(更多讨论待续)
0100 1101 0110 1001 0110 0100 0110 1110 0110 1001 0110 0111 0110 1000 0111 0100
0043 6f64 6572