Замените файл с помощью NSSavePanel в изолированном приложении - PullRequest
2 голосов
/ 30 июля 2011

Я создаю NSSavePanel, используя этот код:

NSSavePanel *savePanel = [NSSavePanel savePanel];
savePanel.delegate = self;

savePanel.directoryURL = ...;
savePanel.nameFieldStringValue = ...;

[savePanel beginSheetModalForWindow:self.window
                  completionHandler:^(NSInteger returnCode) {

if (returnCode == NSFileHandlingPanelOKButton) {

// the completion handler

}
}];

Если на панели сохранения пользователь выбирает уже существующий файл, появляется окно с предупреждением «« XXX »уже существует. Вы хотите заменить его?».

Если пользователь нажимает кнопку «Заменить», в обработчике завершения старый файл удаляется методом removeItemAtPath:error:, равным NSFileManager, и затем создается новый файл (на самом деле: он создается во временном режиме). местоположение, а затем перемещается с использованием moveItemAtPath:toPath:error: метода, но я думаю, что это просто деталь реализации):

if (returnCode == NSFileHandlingPanelOKButton) {
  // overwrite the url, because if we are here is because the user has already
  // expressed its willingness to overwrite the previous file
  NSError *error = nil;
  BOOL res = [[NSFileManager defaultManager] removeItemAtURL:savePanel.URL error:&error];

  if (res) {
    res = [[NSFileManager defaultManager] moveItemAtPath:tmpFilePath toPath:savePanel.URL error:&error];
  }

  // ...
}

В прошлом все всегда работало должным образом. Однако сегодня я начал использовать Lion's Sandbox с правом «Чтение / запись».

В песочнице removeItemAtPath:error: успешен, но следующий moveItemAtPath:toPath:error: возвращает ошибку.

Это кажется разумным, потому что Powerbox дает мне права доступа (при чтении и записи) к файлу. Когда я удаляю этот файл, предоставленное мне право исчерпывается.

Правильно ли мое предположение?

Как я могу решить эту проблему?

Ответы [ 2 ]

1 голос
/ 31 августа 2011

Проблема в том, что после удаления файла ваши права на этот файл также исчезают.Вместо этого вам нужно перезаписать файл, например, используя [[NSFileManager defaultManager] createFileAtPath:contents:attributes:].В документации NSFileManager указано следующее для этого метода:

Если файл уже существует по пути, этот метод перезаписывает содержимое этого файла, если текущий процесс имеет соответствующие привилегии длясделать это.

Использование методов из NSData / NSMutableData также может быть полезным.

0 голосов
/ 07 октября 2011

Используйте [NSFileHandle fileHandleForWritingToURL: error:], а затем writeData: вызовы для перезаписи существующего файла.Этот метод работает для меня в изолированном приложении.Для нового файла просто создайте его с помощью метода NSFileManager createFileAtPath: contents: attribute: (с содержимым, установленным в nil, если содержимое не помещается в память), а затем используйте NSFileHandle для записи данных.

Если вы хотите перезаписатьизображение с использованием базовой графики см. NSSavePanel, CGImageDestinationFinalize и OS X sandbox

...