2011-04-03 66 views
2

我創建需要創建與另一個文件的內容的文件的Mac應用程序,我創建它如下文件:未知錯誤創建目標C

NSString *p = @"/AfilethatEXISTS.plist"; 
NSString *user1 = @"~/Library/MyApp/myFile"; 
    NSString *pT1 = [user1 stringByExpandingTildeInPath]; 
    [[NSFileManager alloc] createFileAtPath:[NSURL URLWithString:pT1] contents:[NSData dataWithContentsOfFile:p] attributes:nil]; 

但是沒有返回錯誤,它沒有創建文件?

回答

6

這段代碼有幾個錯誤,但沒有足夠的上下文來告訴你哪裏出了問題。

首先,不應該有/直接存在文件。該目錄應該是神聖不可侵犯的,許多用戶將無法在沒有管理員權限的情況下寫入該目錄。其次,應該通過NSString和NSURL上的路徑操作API來管理路徑。

接下來,pT1並不是一個真正的URL,也就是URLWithString:可能返回零。改爲使用fileURLWithPath:

最後,該代碼中沒有任何錯誤檢查,因此無法告訴您如何發現無錯誤。你檢查了什麼?

2

首先,您正在錯誤地創建文件管理器實例。要創建一個新的實例,你需要分配和初始化它。

您試圖傳遞一個NSURL對象,由於您用來創建它的字符串不是URL,因此不會正確創建該對象。但無論如何這並不重要,因爲即使創建了NSURL -createFileAtPath:contents:attributes:也需要一個NSString - 只是直接傳遞pT1。

更好的是,由於您基本上只是將p複製到pT1,因此請使用NSFileManager方法來完成此操作。它不僅在概念上更合適,它還使您有機會檢查返回的NSError對象,以查看出錯(如果有的話)。

NSError *error; 
NSFileManager *fm = [[[NSFileManager alloc] init] autorelease]; 
if (![fm copyFileAtPath:p toPath:pT1 error:&error]) { 
    // If copyFileAtPath:toPath:error: returned FALSE, an error occurred, and 
    // error will point to an NSError instance with more information 
} 
+0

不用分配和初始化一個'NSFileManager',只需使用'+ sharedManager'。只是一個頭。 – 2011-04-03 05:26:34

+0

直接從Apple的文檔頁面複製,鏈接如上:「在iOS和Mac OS X v 10.5及更高版本中,您應該考慮使用[[NSFileManager alloc] init]而不是singleton方法defaultManager。創建NSFileManager實例時創建爲線程安全使用[[NSFileManager alloc] init]「。 – 2011-04-03 06:56:38

+0

夠公平的。我想我有一段時間沒有仔細看過文檔。我有點認爲'+ defaultManager'是要走的路,但你是對的。 – 2011-04-03 12:56:59