Objective c 如何覆盖现有文本文件,然后将其追加
我从硬件设备读取设置,需要将它们逐个写入文本文件,一行一行。如果文件已经存在,SavePanel会询问我是否要覆盖它。我回答是的,但是文件被附加到Objective c 如何覆盖现有文本文件,然后将其追加,objective-c,macos,cocoa,Objective C,Macos,Cocoa,我从硬件设备读取设置,需要将它们逐个写入文本文件,一行一行。如果文件已经存在,SavePanel会询问我是否要覆盖它。我回答是的,但是文件被附加到 - (IBAction)saveSettings:(id)sender { self.saveSettings = TRUE; self.firstWrite = TRUE; NSSavePanel *saveText = [NSSavePanel savePanel]; [saveText setNameFieldS
- (IBAction)saveSettings:(id)sender
{
self.saveSettings = TRUE;
self.firstWrite = TRUE;
NSSavePanel *saveText = [NSSavePanel savePanel];
[saveText setNameFieldStringValue:@"SavedSettings.txt"];
[saveText setDirectoryURL:[NSURL fileURLWithPath:@"Documents"]];
[saveText setShowsTagField:NO];
NSInteger saveInt = [saveText runModal];
if(saveInt == NSModalResponseOK)
{
NSURL *pathURL = [saveText URL];
self.pathName = [pathURL path];
[self appendToFile:@"General configuration\n"];
[self appendToFile:@"1\n"];
[self appendToFile:@"1\n"];
[self appendToFile:@"Configuration axis 1\n"];
[self readMoveDelayAxis1];
}
}
- (BOOL)appendToFile:(NSString *)strcontent;
{
BOOL result = YES;
NSFileHandle* fh = [NSFileHandle fileHandleForWritingAtPath:self.pathName];
if ( !fh )
{
[[NSFileManager defaultManager] createFileAtPath:self.pathName contents:nil attributes:nil];
fh = [NSFileHandle fileHandleForWritingAtPath:self.pathName];
}
if ( !fh ) return NO;
@try {
[fh seekToEndOfFile];
self.firstWrite = FALSE;
[fh writeData:[strcontent dataUsingEncoding:NSUTF8StringEncoding]];
}
@catch (NSException * e) {
result = NO;
}
[fh closeFile];
return result;
}
根据下面的答案修改代码
- (IBAction)saveSettings:(id)sender
{
self.saveSettings = TRUE;
NSSavePanel *saveText = [NSSavePanel savePanel];
[saveText setNameFieldStringValue:@"SavedSettings.txt"];
[saveText setDirectoryURL:[NSURL fileURLWithPath:@"Documents"]];
[saveText setShowsTagField:NO];
NSInteger saveInt = [saveText runModal];
if(saveInt == NSModalResponseOK)
{
NSURL *pathURL = [saveText URL];
NSFileManager *filemgr;
filemgr = [NSFileManager defaultManager];
if ([filemgr fileExistsAtPath:[pathURL path]] == YES)
{
[filemgr removeItemAtPath:[pathURL path] error: NULL];
}
self.pathName = [pathURL path];
[self appendToFile:@"General configuration\n"];
[self appendToFile:@"1\n"];
[self appendToFile:@"1\n"];
[self appendToFile:@"Configuration axis 1\n"];
[self readMoveDelayAxis1];
}
}
与其他
NSOpenPanel
/NSSavePanel
情况一样,NSSavePanel
UI只是询问用户是否应该覆盖文件,它只是将选定的URL返回到应用程序
您的代码需要检查文件是否已经存在,如果已经存在则截断它,类似于已经检查文件是否不存在并创建文件(如果存在)
您可以使用诸如truncatefleatoffset:
之类的方法,以及诸如ftruncate(2)
之类的函数
嗯