2013-04-25 54 views
2

我目前正在寫使用下面的代碼文件:寫入文件 - 目標C

NSString *state = @"Oklahoma"; 

    NSString *filepath = [[NSBundle mainBundle] pathForResource:@"StatesVisited" ofType:@"txt"]; 
    NSFileHandle *filehandle = [NSFileHandle fileHandleForWritingAtPath:filepath]; 
    [filehandle seekToEndOfFile]; 
    [filehandle writeData:[state dataUsingEncoding:NSUTF8StringEncoding]]; 
    [filehandle closeFile]; 

從我可以告訴,這應該工作。我已經能夠使用相同的文件路徑從文件中讀取數據。

當我運行這段代碼,並打開我的文本文件什麼都不存在。

+2

請記住,在閱讀權限並不意味着你也有寫權限。 – 2013-04-25 21:25:37

+0

如何獲得寫入和讀取到同一文件的權限? – Johnrad 2013-04-25 21:27:31

+0

@JohnnyWhisman你**不能**在運行時獲得對主包的寫入權限。一旦應用程序被編譯和部署,該包就會被簽名。這是爲了確保你的惡意軟件已經改變了應用程序。 ** SandBox ** – 2013-04-25 22:20:07

回答

3

[NSBundle mainBundle]必須被視爲只讀。相反,請將該文件夾中的文件複製到應用程序支持目錄,然後在其中寫入。

使用this查找/創建應用程序支持目錄。

+0

我也經常從文件中讀取文件。我是否需要從支持目錄中的文件中讀取數據? – Johnrad 2013-04-25 21:38:41

+2

這並不是說主包必須被視爲只讀,而是主包是隻讀的(至少在真實設備上)。 – rmaddy 2013-04-25 23:04:15

+0

@rmaddy這取決於操作系統。在Mac OS X上,它通常是可寫的,在Xcode的iOS模擬器中它可能是可寫的,在越獄的iPhone上它可能是可寫的(我不知道這一點,你必須測試)。即使你可以寫信給它,這也不是個好主意,因爲升級到新版本的應用程序將覆蓋該文件。 – 2013-04-26 00:17:26

1

禁止寫入主包中的資源。在這種情況下,您必須使用沙盒路徑的/Documents/Library

第一次啓動您的應用程序只是複製所有捆綁的文件/文件到/ Documents,here's a link以下。

之後,只需按照自己的設計 - 這一次它會工作得很好。

+0

我已將此代碼添加到我的viewDidLoad方法中。這是否會改變我爲閱讀和寫作而編寫的任何代碼。或者,我需要添加這一切嗎? – Johnrad 2013-04-25 21:44:24

+0

而不是從NSBundle製作文件路徑,您需要從/ Documents文件夾中找到路徑: – 2013-04-26 11:20:27

0

您可能從fileHandleForWritingAtPath:獲得無文件句柄,因爲您嘗試在應用程序包中打開文件。如果數據合適,您可以將數據寫入NSUserDefaults。否則,您應該將文件寫入您的應用程序支持目錄。以下blog post描述瞭如何獲取它或遵循@Sebastians關於Document文件夾的建議。

0

試試這個

NSString *state = @"Oklahoma"; 
NSString *strPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; 
       strPath = [strPath stringByAppendingPathComponent:@"StatesVisited.txt"]; 
       [state writeToFile:strPath 
          atomically:NO 
          encoding:NSStringEncodingConversionAllowLossy 
           error:nil];