2

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 はファイルに (読み書きで) アクセスする権利を与えてくれるので、これは合理的だと思われます。このファイルを削除すると、私に与えられた権利がなくなります。

私の推測は正しいですか?

どうすればこの問題を解決できますか?

4

2 に答える 2

1

問題は、ファイルを削除すると、そのファイルに対するあなたの権利も失われることです。代わりに行う必要があるのは、たとえばを使用してファイルを上書きすることです[[NSFileManager defaultManager] createFileAtPath:contents:attributes:]NSFileManagerのドキュメントには、このメソッドについて次のように記載されています。

パスにファイルがすでに存在する場合、現在のプロセスに適切な権限がある場合、このメソッドはそのファイルの内容を上書きします。

NSData/からのメソッドを使用するNSMutableDataことも役立つ場合があります。

于 2011-08-31T14:52:56.207 に答える
0

[NSFileHandle fileHandleForWritingToURL:error:] の後に writeData: 呼び出しを使用して、既存のファイルを上書きします。この方法は、サンドボックス化されたアプリで機能します。新しいファイルの場合は、NSFileManager のメソッド createFileAtPath:contents:attributes: (内容がメモリに収まらない場合は内容を nil に設定) で作成し、NSFileHandle を使用してデータを書き込みます。

コア グラフィックスを使用して画像を上書きする場合は、NSSavePanel、CGImageDestinationFinalize、および OS X サンドボックスを参照してください。

于 2011-10-07T07:54:56.747 に答える