2011-08-21 189 views
0

我已經寫了一些代碼來將應用程序包中的文件(dbtemplate.sqlite)複製到庫中。但是,庫中沒有顯示文件,每次啓動應用程序時都會記錄它複製模板的文本。控制檯中沒有顯示錯誤。我究竟做錯了什麼?爲什麼NSFileManager無法正常工作?

NSFileManager *fileManager = [NSFileManager defaultManager]; 

if (![fileManager fileExistsAtPath:@"~/Library/AppSafe/database/db.sqlite"]) { 

    [fileManager createDirectoryAtPath:@"~/Library/AppSafe/database" withIntermediateDirectories:YES attributes:nil error:nil]; 

    [fileManager copyItemAtPath:@"dbtemplate.sqlite" toPath:@"~/Library/AppSafe/database/db.sqlite" error:nil]; 
    NSLog(@"copied template"); 

} 

回答

8

如果我沒有記錯,您必須將完整路徑傳入NSFileManager方法,並且使用帶波浪號的前綴路徑將不起作用。的

因此而不是使用@"~/Library/...",用途:

[@"~/Library/..." stringByExpandingTildeInPath] 
+1

或者,更可靠地向NSFileManager請求應用程序支持中相關文件夾的路徑。打開沙箱後,可能會/將會對某個路徑進行硬編碼(某些路徑將會,某些路徑可能會中斷)。 –

+0

這是你的問題。 – SevenBits

0

我會建議在文檔文件夾中保存文件,即時通訊不知道如果你甚至可以保存在庫文件夾中的文件。使用該代碼的文件夾中創建你的文件的路徑:

NSString *path = [documentsDirectory stringByAppendingPathComponent:@"db.sqlite"]; 

並簡單地檢查它是否存在這樣的:

if (![fileManager fileExistsAtPath:path]) 

所以不如你的文件移動到文件夾。

+0

它,有可能在圖書館保存在某些地方的文件;是否其中任何一個比文件更合適取決於文件的目的。 (文檔僅適用於用戶創建的內容。)無論採用哪種方式,合併裝訂路徑都是不推薦使用的方法。正確的解決方案是向NSFileManager對象請求所需目錄中的路徑;當在Mac OS X下運行沙箱時,NSFileManager將解鎖您對該文件的訪問權限,而手工路徑則不會。 –

1

我相信你的問題在於copyItemAtPath:,因爲你給的字符串不是正確的路徑。使用類似[[NSBundle mainBundle] pathForResourceWithName:]的東西來獲取資源的實際路徑。另外,我不確定〜你的路徑是否被支持 - 你可能需要使用一些NSString函數來擴展它。

相關問題