跳转到内容

Futurebasic/语言/cfurlref

来自维基教科书,自由的教学读本

CFURLRef 结构体

[编辑 | 编辑源代码]

通过 URL 访问文件和资源。

CFURL 提供了创建、解析和解除引用 URL 字符串的功能。CFURL 对需要使用 URL 访问资源(包括本地文件)的应用程序很有用,因此它包含在这里。

Apple 工程师已将 CFURL 与其 Cocoa Foundation 对应物 NSURL “无缝桥接”。对于 FB 和 FBtoC 程序员来说,这是个好消息,因为 Cocoa 在线提供的许多代码片段都可移植到我们的 Carbon 代码中。

一个 CFURL 对象由两个部分组成

   1.) 一个基本 URL,它可以为空、0 或 C 中的 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 系统启动服务的技术,然后启动服务为用户打开该文件以便在系统的默认文本应用程序中阅读。

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

华夏公益教科书