2016-01-15 2 views
1

Я хочу размонтировать диск БЕЗ ЭЖЕКТИРОВАНИЯ. Для этого я попытался следующий кодРазборка привода/объем без выброса

{ 
    NSString *path; 
    CFStringRef *volumeName=(__bridge CFStringRef)path; 
    DASessionRef session = DASessionCreate(kCFAllocatorDefault); 
    CFURLRef pathRef = CFURLCreateWithString(NULL, CFSTR("/volumes/Untitled"), NULL); 
    DADiskRef disk = DADiskCreateFromVolumePath(kCFAllocatorDefault, session, pathRef); 
    DADiskUnmount(disk, kDADiskUnmountOptionForce, NULL, NULL); 
} 

This code is from this question, Thanks to @zeFree

Его работает, но я хочу, динамический путь к объему, где, как и в коде его статичным. Я попытался изменить NSString на CFStringRef, а затем попытался использовать на месте пути («/ volume/Untitled»), но он все тот же.

Любое предложение приветствуется.

ответ

1

Прежде всего, вам категорически не рекомендуется использовать kDADiskUnmountOptionForce.

Это метод размонтирования тома по заданному URL с базовой обработкой ошибок и управлением памятью.

- (BOOL)unmountVolumeAtURL:(NSURL *)url 
    BOOL returnValue = NO; 
    DASessionRef session = DASessionCreate(kCFAllocatorDefault); 
    if (session) { 
     DADiskRef disk = DADiskCreateFromVolumePath(kCFAllocatorDefault, session, (__bridge CFURLRef)url); 
     if (disk) { 
      DADiskUnmount(disk, kDADiskUnmountOptionDefault, NULL , NULL); 
      returnValue = YES; 
      CFRelease(disk); 
     } else { 
      NSLog(@"Could't create disk reference from %@", url.path); 
     } 
    } else { 
     NSLog(@"Could't create DiskArbritation session"); 
    } 

    if (session) CFRelease(session); 
    return returnValue; 
} 

Обработка ошибок может быть еще улучшен путем предоставления обработчика обратного вызова в функции DADiskUnmount.

+0

Решил мою проблему сэр. Хотелось бы уведомить, что существует некоторая ошибка ввода, например 'DASessionRef session = DASession' и' if (disk) CFRelease (disk) 'должен находиться внутри блока, где он объявлен. –

Смежные вопросы