Подтвердить что ты не робот

Добавление к концу файла с помощью NSMutableString

У меня есть файл журнала, который я пытаюсь добавить в конец. У меня есть переменная NSMutableString textToWrite, и я делаю следующее:

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

Однако, когда я делаю это, весь текст внутри файла заменяется текстом в textToWrite. Как я могу добавить в конец файла? (Или еще лучше, как я могу добавить в конец файла новую строку?)

4b9b3361

Ответ 1

Я думаю, вы могли бы сделать пару вещей:

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

Обратите внимание, что это добавит NSData к вашему файлу - НЕ NSString. Обратите внимание, что если вы используете NSFileHandle, вы должны убедиться, что файл существует перед началом работы. fileHandleForWritingAtPath будет возвращать нуль, если на пути не существует файла. См. ссылка класса NSFileHandle.

Или вы могли бы сделать:

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

Я считаю, что первый подход был бы наиболее эффективным, поскольку второй подход включает в себя чтение содержимого файла в NSString перед записью нового содержимого в файл. Но, если вы не хотите, чтобы ваш файл содержал NSData и предпочитал хранить текст, второй вариант будет более подходящим для вас.

[Обновление] Поскольку 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];

fooobar.com/questions/200425/...

Ответ 2

Первоначально я думал, что используя метод FileHandler в принятом ответе, что я собираюсь получить кучу шестнадцатеричных значений данных, записанных в мой файл, но у меня есть читаемый текст, который мне нужен. Поэтому, основываясь на принятом ответе, это то, с чем я столкнулся:

-(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.

Ответ 3

И вот (слегка принятая) версия Swift решение Chase Roberts:

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)")
        }
    }
}