2012-06-19 40 views
26

最後にデータを追加しようとしているログファイルがあります。私はNSMutableStringtextToWrite変数を持っている、と私は次のことをやっている:NSMutableStringを使用してファイルの末尾に追加する

[textToWrite writeToFile:filepath atomically:YES 
            encoding: NSUnicodeStringEncoding error:&err]; 

しかし、私はこれを行うときに、ファイル内のすべてのテキストがtextToWrite内のテキストに置き換えられます。代わりにファイルの末尾に追加する方法はありますか? (または、より良い、私は新しいライン上のファイルの末尾に追加することができますか?)

+0

私は 'NSLog'は、あなたが望むように動作しないことを推測? – zneak

+0

FYI、それをファイルに追加させる 'NSString' /' NSMutableString'メソッドはありません。しかし、ここには例があります(http://lists.apple.com/archives/cocoa-dev/2002/Aug/msg00754.html)。 – zneak

答えて

48

私はあなたが物事のカップル行うことができると思います。これは、あなたにNSDataのを追加することを

NSFileHandle *fileHandle = [NSFileHandle fileHandleForWritingAtPath:aPath]; 
[fileHandle seekToEndOfFile]; 
[fileHandle writeData:[textToWrite dataUsingEncoding:NSUTF8StringEncoding]]; 
[fileHandle closeFile]; 

は注意をファイル - NSStringではありません。 NSFileHandleを使用する場合は、その前にファイルが存在することを確認する必要があります。パスにファイルが存在しない場合、fileHandleForWritingAtPathはnilを返します。 NSFileHandle class referenceを参照してください。

あなたができる

または:

NSString *contents = [NSString stringWithContentsOfFile:filepath]; 
contents = [contents stringByAppendingString:textToWrite]; 
[contents writeToFile:filepath atomically:YES encoding: NSUnicodeStringEncoding error:&err]; 

私は2番目のアプローチは、ファイルに新しい内容を書き込む前のNSStringにファイルの内容を読み込む伴うため第一のアプローチは、最も効率的であると信じています。しかし、ファイルにNSDataが含まれていないようにしてテキストを保持したい場合は、2番目のオプションが適しています。

[更新] stringWithContentsOfFileあなたは第二のアプローチを変更することができdeprecatedですので:

当初
NSError* error = nil; 
NSString* contents = [NSString stringWithContentsOfFile:filepath 
               encoding:NSUTF8StringEncoding 
                error:&error]; 
if(error) { // If error object was instantiated, handle it. 
    NSLog(@"ERROR while loading from file: %@", error); 
    // … 
} 
[contents writeToFile:filepath atomically:YES 
           encoding:NSUnicodeStringEncoding 
            error:&err]; 

See question on stackoverflow

+0

私はあなたの最初の提案をしましたが、それが動作している間、私はこれが本当に奇妙なエラーを抱えています。 (私がファイルに書き込んでいるすべてのデータは英語ですが、以前はテキストを置き換えていたときに、それが英語として表示されました) –

+0

私の回答を編集しました...ファイルにNSDataを追加していますテキスト。ファイルをプレーンテキストとして保存する場合は、2番目の方法を使用する必要があります。 –

23

私は受け入れ答えにFileHandlerのメソッドを使用して、私が取得するつもりだったと思いました私のファイルに書き込まれた16進データ値の束ですが、私が必要とするすべての読み込み可能なテキストがあります。したがって、受け入れられた答えに基づいて、これは私が思いついたものです。

-(void) writeToLogFile:(NSString*)content{ 
    content = [NSString stringWithFormat:@"%@\n",content]; 

    //get the documents directory: 
    NSString *documentsDirectory = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"]; 
    NSString *fileName = [documentsDirectory stringByAppendingPathComponent:@"hydraLog.txt"]; 

    NSFileHandle *fileHandle = [NSFileHandle fileHandleForWritingAtPath:fileName]; 
    if (fileHandle){ 
     [fileHandle seekToEndOfFile]; 
     [fileHandle writeData:[content dataUsingEncoding:NSUTF8StringEncoding]]; 
     [fileHandle closeFile]; 
    } 
    else{ 
     [content writeToFile:fileName 
        atomically:NO 
        encoding:NSStringEncodingConversionAllowLossy 
         error:nil]; 
    } 
} 

この方法で、ファイルがまだ存在しない場合は作成します。既に存在する場合は、追加するだけです。また、plistに行き、情報プロパティーリストUIFileSharingEnabledの下にキーを追加し、値をtrueに設定すると、ユーザーは自分のコンピューターと同期して、iTunesを通じてログファイルを見ることができます。ここ

+0

新しいファイルを作成するときに、ファイルに追加するときとは異なるエンコーディングを使用する理由はありますか? – huggie

+0

いいえ、私はそれに気付かなかった。 –

+1

そのパスを構築するよりきれいな方法は、 '[documentsDirectory stringByAppendingPathComponent:@" hydraLogを使用することです。txt "]' –

1

Chase Roberts' solutionの(やや採択)スウィフトバージョンです:

static func writeToFile(content: String, fileName: String = "log.txt") { 
    let contentWithNewLine = content+"\n" 
    let filePath = NSHomeDirectory() + "/Documents/" + fileName 
    let fileHandle = NSFileHandle(forWritingAtPath: filePath) 
    if (fileHandle != nil) { 
     fileHandle?.seekToEndOfFile() 
     fileHandle?.writeData(contentWithNewLine.dataUsingEncoding(NSUTF8StringEncoding)!) 
    } 
    else { 
     do { 
      try contentWithNewLine.writeToFile(filePath, atomically: true, encoding: NSUTF8StringEncoding) 
     } catch { 
      print("Error while creating \(filePath)") 
     } 
    } 
} 
関連する問題