2014-03-06 48 views

回答

4

如果你只是想結束一個CFStringRef變量而不介意使用Foundation,那麼最簡單的事情就是使用NSString的初始化工具之一從文件系統中讀取並將其從ARC中移出:

NSString * string = [NSString stringWithContentsOfFile:@"/path/to/file" encoding:NSUTF8StringEncoding error:nil]; 
CFStringRef cfstring = CFBridgingRetain(string); 

當然,如果你想有一個純CF解決方案,那麼我建議是這樣的:

FILE * file; 
size_t filesize; 
unsigned char * buffer; 

// Open the file 
file = fopen("/path/to/file", "r"); 
// Seek to the end to find the length 
fseek(file, 0, SEEK_END); 
filesize = ftell(file); 
// Allocate sufficient memory to hold the file 
buffer = calloc(filesize, sizeof(char)); 
// Seek back to beggining of the file and read into the buffer 
fseek(file, 0, SEEK_SET); 
fread(buffer, sizeof(char), filesize, file); 
// Close the file 
fclose(file); 
// Initialize your CFString 
CFStringRef string = CFStringCreateWithBytes(kCFAllocatorDefault, buffer, filesize, kCFStringEncodingUTF8, YES); 
// Release the buffer memory 
free(buffer); 

在這種情況下,你需要使用標準C庫函數來獲取文件的字節的緩衝區內容。如果你處理的文件太大而無法加載到內存緩衝區,那麼你可以很容易地使用mmap函數來存儲文件,這是NSData在很多情況下所做的。

+0

我結束了使用C I/O庫。我想知道是否有隻使用CF庫的解決方案。 –