Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 如何覆盖现有文本文件,然后将其追加_Objective C_Macos_Cocoa - Fatal编程技术网

Objective c 如何覆盖现有文本文件,然后将其追加

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

我从硬件设备读取设置,需要将它们逐个写入文本文件,一行一行。如果文件已经存在,SavePanel会询问我是否要覆盖它。我回答是的,但是文件被附加到

- (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)
之类的函数