writeToFile in OSX, appending to the file?
I ne开发者_如何学Pythoned to write some data from time to time to a file, appending to it.
Right now I have:
BOOL ok = [[NSString stringWithFormat:@"%f",raw] writeToFile:path atomically:YES encoding:NSUnicodeStringEncoding error:&error];
How could I append to the end of the file the new contents of raw
?
Here is an NSString category method that will append the receiver to the specified path with the specified encoding (normally NSUTF8StringEncoding).
- (BOOL) appendToFile:(NSString *)path encoding:(NSStringEncoding)enc;
{
BOOL result = YES;
NSFileHandle* fh = [NSFileHandle fileHandleForWritingAtPath:path];
if ( !fh ) {
[[NSFileManager defaultManager] createFileAtPath:path contents:nil attributes:nil];
fh = [NSFileHandle fileHandleForWritingAtPath:path];
}
if ( !fh ) return NO;
@try {
[fh seekToEndOfFile];
[fh writeData:[self dataUsingEncoding:enc]];
}
@catch (NSException * e) {
result = NO;
}
[fh closeFile];
return result;
}
One method would be to obtain a NSFileHandle using fileHandleForWritingAtPath: method, converting your NSString to NSData and then calling writeData: on your NSFileHandle after moving the file pointer to the end of the file.
Li'l edit to Peter N Lewis Answer:
- (BOOL) appendToFile:(NSString *)path encoding:(NSStringEncoding)enc;
{
BOOL result = YES;
NSFileHandle* fh = [NSFileHandle fileHandleForWritingAtPath:path];
if ( !fh ) {
[[NSFileManager defaultManager] createFileAtPath:path contents:nil attributes:nil];
fh = [NSFileHandle fileHandleForWritingAtPath:path];
}
if ( !fh ) return NO;
@try {
[fh seekToEndOfFile];
[fh writeData:[strcontent dataUsingEncoding:enc]];
}
@catch (NSException * e) {
result = NO;
}
[fh closeFile];
return result;
}
Call Where ever you want
[self appendToFile:fileName encoding:NSUTF8StringEncoding];
strcontent
may be self
when you put this method to a Catagory of NSString.
This is my Swift version, not exactly the same, but it works. I decided not to extend String so that it could be used as an alternate to write(exportFileNameURL: URL, str: String)
fileprivate static func appendToFile(_ exportFileName: String, str: String) -> Bool {
let result : Bool = true;
if let fh : FileHandle = FileHandle.init(forWritingAtPath: exportFileName) {
fh.seekToEndOfFile()
fh.write(str.data(using: String.Encoding.utf8)!)
fh.closeFile()
}
else {
FileManager.default.createFile(atPath: exportFileName, contents: nil, attributes: nil)
if let fh = FileHandle.init(forWritingAtPath: exportFileName) {
fh.seekToEndOfFile()
fh.write(str.data(using: String.Encoding.utf8)!)
fh.closeFile()
}
else {
return false;
}
}
return result
}
精彩评论