Реализация NSDocument isLocked для 10.7?

Как я могу проверить, заблокирован ли документ в 10.7?

NSDocument имеет метод isLocked, но он доступен только в версии 10.8.


person Yoav    schedule 21.08.2012    source источник


Ответы (1)


Вот моя реализация:

+ (BOOL)isDocumentLocked:(NSDocument*)doc
{
  if (doc == nil)
  {
    return NO;
  }
  else if ([doc respondsToSelector:@selector(isLocked)]) // 10.8
  {
    return [doc isLocked];
  }
  else // OS X version < 10.8
  {
    NSError * error;
    BOOL isAutosavingSafe = [doc checkAutosavingSafetyAndReturnError:&error];
    if (!isAutosavingSafe)
    {
      return YES;
    }

    if (doc.fileURL == nil)
      return NO;

    NSFileManager* fm = [NSFileManager defaultManager];
    NSString* path = doc.fileURL.absoluteURL.path;

    if (![fm isWritableFileAtPath:path])
      return YES; // No writing permissions

    NSDictionary *attributes = [fm attributesOfItemAtPath:path error:&error];
    BOOL isLocked = [[attributes objectForKey:NSFileImmutable] boolValue];
    if (isLocked)
    {
      return YES;
    }
  }
  return NO;
}
person Yoav    schedule 22.08.2012
comment
Обратите внимание: здесь не нужно звонить absoluteURL - person Mike Abdullah; 11.04.2013
comment
Для OS X 10.7 и новее также есть [url getResourceValue:&writable forKey:NSURLIsWritableKey error:&error], который немного чище - person Mike Abdullah; 11.04.2013