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