2012-01-03 25 views
3

我使用與Objective-C的應用程序中的可可下面的代碼訪問plist文件訪問Mac的屬性文件:通過C

NSString *plistPath = [@"~/Library/Preferences/com.apple.mail.plist" stringByExpandingTildeInPath]; 
NSDictionary *plistData = [NSDictionary dictionaryWithContentsOfFile:plistPath]; 
NSArray *item = [plistData valueForKeyPath:@"MailAccounts.AccountName"]; 
NSLog(@"Account: %@", [item objectAtIndex:2]); 

基本上返回用戶的電子郵件地址(我們也看到一些其他的關於其他plist文件的信息),所以我們可以將它添加到關於對話框。

我現在需要使用C而不是Objective-C從相同的plist文件中讀取此信息。這些文件不是文本,它們是二進制編碼的plist文件。有沒有辦法從C中讀取這些屬性文件?

我可以從C調用NSDictionary等嗎?怎麼樣?

感謝您的幫助。

回答

4

當然,你意識到Objective C是C的擴展,但是一般來說,當我使用普通ol C時,我使用Core Foundation函數和對象代替Objective C方法。

對於您的具體問題:CFDictionary是免費橋接到NSDictionary和CFBundle NSBundle。您可以輕鬆地從純醇調用的CoreFoundation」 C.

你可以得到你想要的東西像什麼:

CFBundleRef mainBundle = CFBundleGetMainBundle(); 
CFDictionaryRef dictionaryRef = CFBundleGetInfoDictionary(mainBundle); 
if(dictionaryRef) 
{ 
    CFArrayRef accountsItemsArrayRef = CFDictionaryGetValue(dictionaryRef, CFSTR("MailAccounts.AccountName"); 
    if(accountsItemsArrayRef) 
    { 
     CFStringRef accountNameRef = (CFStringRef) CFArrayGetValueAtIndex(accountsItemsArrayRef, 2); 
     if(accountNameRef) 
     { 
       fprintf(stderr, "Account: %s", accountName.cStr()); 
     }  
    } 
} 

我只是直接輸入這個核心基礎翻譯成這個答案框並沒有任何錯誤或神智檢查,你絕對需要這樣做。

Here is a slightly older tutorial這解釋了一點。

希望這有助於你走上正確的道路!

+0

謝謝。任何機會的代碼片段? – 2012-01-03 18:44:50

+0

太棒了,讓我試試看。順便說一句,你想要什麼''包括'? – 2012-01-03 19:02:07

+0

是的...我在那裏犯了一個錯字。使用'CFArrayGetValueAtIndex'來獲取索引值。我在上面的答案中更正了我的代碼。 – 2012-01-03 19:26:41