跳轉到內容

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

華夏公益教科書