2012-05-20 122 views
3

ios聲稱文件已被寫入,但更改從未實際保存,就好像它們保留在緩衝區中一樣。我必須沖洗什麼?ios writeToFile更改不保存

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    NSString *myFilePath = [[NSBundle mainBundle] 
          pathForResource:@"MyFile" 
          ofType:@"txt"]; 

    NSLog(@"\n\nPath = \n%@", myFilePath); 

    NSString *myFileContents = [NSString stringWithContentsOfFile:myFilePath 
            encoding:NSUTF8StringEncoding 
            error:nil]; 


    NSLog(@"\n\nContents = \n%@", myFileContents); 

    [@"This line will be written to file" writeToFile:myFilePath 
     atomically:YES encoding:NSUTF8StringEncoding error:nil]; 

    NSString *changedContents = [NSString stringWithContentsOfFile:myFilePath 
            encoding:NSUTF8StringEncoding 
            error:nil]; 

    NSLog(@"\n\nChanged Contents = \n%@", changedContents); 
} 

輸出:

Path = 
/Users/hamzeh/Library/Application Support/iPhone Simulator/5.1/Applications/2B318687-A745-4CD9-85BA-52A01AB76F6E/savepersistentdata_tutorial.app/MyFile.txt 

Contents = 
This is a text file. 
The file will be displayed on the iPhone. 
That is all for now. 

Changed Contents = 
This line will be written to file 

這是輸出每次都遇到我運行時間,所以變化不會真正得到寫入文件。

感謝您的幫助。

+0

資源包是隻讀的。 –

回答

7

您無法編輯主包中的文件。您必須先將文件保存到應用程序文檔文件夾,然後進行任何更改。

下面是一些代碼來也許解決您的問題:

首先將文本保存到你創建一個目錄:

NSString *myFilePath = [[NSBundle mainBundle] 
          pathForResource:@"MyFile" 
          ofType:@"txt"]; 
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES); 
NSString *directory = [NSString stringWithFormat:@"%@/Some_Directory", [paths objectAtIndex:0]]; 

// Check if the directory already exists 
if (![[NSFileManager defaultManager] fileExistsAtPath:directory]) { 
    // Directory does not exist so create it 
    [[NSFileManager defaultManager] createDirectoryAtPath:directory withIntermediateDirectories:YES attributes:nil error:nil]; 
} 

NSData *data = [[NSData dataWithContentsOfFile:myFilePath] retain]; 

NSString *filePath = [[directory stringByAppendingPathComponent:[NSString stringWithFormat:@"%@", [myFilePath lastPathComponent]]] retain]; 



NSError *error = nil; 
if (![data writeToFile:filePath options:NSDataWritingFileProtectionNone error:&error]) { 
    [data writeToFile:filePath atomically:NO]; 
} 
[data release]; 
[filePath release]; 
+0

是的,我評論過我如何在下面修復它,主要的軟件包文件是不可寫的。 – peasant13337

0

使用NO參數

[@"This line will be written to file" writeToFile:myFilePath atomically:NO encoding:NSUTF8StringEncoding error:nil]; 

iOS的文檔說

(BOOL)useAuxiliaryFile
如果是,接收器被寫入到一個輔助文件,然後輔助文件重命名爲路徑。如果否,則接收器直接寫入路徑。 YES選項保證路徑(如果存在的話)即使系統在寫入期間崩潰也不會被破壞。

+0

這不適合我,但我想通了。而不是像我上面所做的那樣獲取文件路徑,我通過:NSString * docsDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES)objectAtIndex:0]; NSString * path = [docsDirectory stringByAppendingPathComponent:@「MyFile.txt」]; – peasant13337

+0

哦..我錯過了...是的,你只是在文檔目錄中寫的,主要的軟件包是隻讀的... –

0

你不能寫在主束文件,因爲資源包是隻讀的。您也可以檢查退回writeToFile方法。如果將其部署到設備上,則返回false。