2011-05-02 106 views
14

我試圖從一個文件獲取內容並將其寫入另一個文件。我讀得很好,但我無法將它寫入另一個文件。使用[NSBundle mainBundle]寫入文件失敗

我有一個單詞數據庫。我想根據字母數字將單詞分成不同的文件。所有四個字母單詞都歸入一個文件,依此類推。我增加了一個叫做「4letter」到我的資源txt文件和下面是我的代碼:

NSError *error; 

//READ 
NSString *dbFile = [[NSBundle mainBundle] pathForResource:@"words" ofType:@"txt"]; 
NSString *test = [NSString stringWithContentsOfFile:dbFile encoding:NSUTF8StringEncoding error:&error]; 

//convert from string to array 
NSArray *lines = [test componentsSeparatedByString:@"\n"]; 

NSFileHandle *logFile = nil; 
logFile = [NSFileHandle fileHandleForWritingAtPath:[[NSBundle mainBundle] pathForResource:@"4letter" ofType:@"txt"]]; 

//Test if write works 
for (int i=0; i<5; i++) 
{ 
    NSString *randomAnagram = [[lines objectAtIndex:i] lowercaseString]; 
    [logFile writeData: [randomAnagram dataUsingEncoding: NSNEXTSTEPStringEncoding]]; 
} 

回答

22

在iOS中,也可以不寫到您的應用程序的包文件 - 將整捆爲只讀。改爲在「文檔」文件夾中使用路徑。

+1

什麼是文檔文件夾的路徑?我的目標是iOS。寫入它後,我可以在哪裏找到文件夾? – Abhinav 2011-05-02 02:41:29

+4

請參閱[標準系統目錄(http://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/LowLevelFileMgmt/Articles/StandardDirectories.html#//apple_ref/doc/uid/20001279-SW4)學習如何查找Documents目錄以及其他標準目錄。 – Caleb 2011-05-02 02:49:16

+1

要獲取的文件夾使用的路徑: 的NSArray *路徑= NSSearchPathForDirectoriesInDomains(NSDocumentsDirectory,NSUserDomainMask,YES); NSString * documentsDirectory = [paths objectAtIndex:0]; – OscarVGG 2013-02-03 16:18:10

4

您的應用程序包是隻讀的。有兩種方法,我可以看到:

1)寫的文檔文件夾中:

NSArray *pathList = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *path =  [myPathList  objectAtIndex:0]; 

2)使用SQLite數據庫。這與1相同(無論如何,您必須在文檔中保存數據庫),但是您使用的是sqlite數據庫。我認爲這比許多txt和plist文件更好:here's a tutorial on the topic

+0

非常感謝。讓我看看我能否得到這個工作。 – Abhinav 2011-05-02 04:24:24

7

像Caleb說的,你不能寫入你的應用程序的目錄,但你可以寫入你的應用程序的Documents文件夾。你可以這樣說:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
8

更好understnading見特殊File System Programming Guide
在iOS中,無法寫入應用程序包中的文件 - 整個包是隻讀的。

考慮閱讀iOS Data Storage Guidelines以更好地理解iCloud備份環境下目錄的用途。

< APPLICATION_HOME> /AppName.app

這是包含應用本身束目錄。不要將 任何內容寫入此目錄。爲防止篡改,捆綁軟件目錄 在安裝時被簽名。寫入此目錄將更改 簽名並阻止您的應用再次啓動。


< APPLICATION_HOME> /文檔/

使用此目錄存儲關鍵用戶文檔和應用程序數據 文件。關鍵數據是您的應用無法重新創建的任何數據,例如用戶生成的內容。該目錄的內容可以是 ,通過文件共享提供給用戶。這個 目錄的內容由iTunes備份。


< APPLICATION_HOME> /庫/

此目錄是不屬於用戶 數據文件文件的頂級目錄。通常,您可以把文件的幾個標準 子目錄之一,但你也可以爲你 想要備份而不暴露給用戶的文件創建自定義的子目錄。這個目錄不應該使用 用戶數據文件。這個目錄 (與緩存子目錄除外)的內容通過 的iTunes備份。有關Library目錄的更多信息,請參見 「圖書館目錄存儲應用程序特定的文件。」

iOS Standard Directories: Where Files Reside

UPDATE
我完整列表(TMP /,文件/收件箱)使用的NSFileManager方法URLForDirectory:inDomain:appropriateForURL:create:error:

+0

我甚至讀過這個完整的文檔。我有困惑,如果我保存我的文件夾中的非常imp文件或視頻。然後它會輕鬆地提供給其他人。 – python 2014-02-25 13:53:28

+1

您不能共享這樣的文件,因爲每個文件只能從您的應用程序中看到。要共享您需要的文檔['文檔交互編程Guide'(https://developer.apple.com/library/ios/documentation/FileManagement/Conceptual/DocumentInteraction_TopicsForIOS/Introduction/Introduction.html#//apple_ref/doc/uid/ TP40010403) – DanSkeel 2014-02-26 10:33:55

2

我使用以下代碼:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *documentsDirectory = [paths objectAtIndex:0]; 
NSString *appFile = [documentsDirectory stringByAppendingPathComponent:@"set.txt"]; 

NSString *[email protected]"Kostas"; 

[data writeToFile:appFile atomically:YES]; 

NSString *myData = [NSString stringWithContentsOfFile:appFile]; 

NSLog(@"Data : %@ ",myData); 
+2

這與問題中的代碼有什麼不同?爲什麼問題中的代碼失敗,以及代碼如何避免這個問題? – 2013-02-10 01:37:21

+2

不同的是,我找到我的文件到應用程序的Documents目錄,在那裏我可以寫入它。問題中的代碼使用只讀的應用程序包。 – Kostas 2013-02-10 17:03:10

相關問題