2015-07-21 2 views
3

Из Objective C (или Swift) мне нужно определить, является ли смонтированный том образ диска (установленный из файла .dmg).Определите, является ли тома образ диска (DMG) из кода

Аналогичные вопросы привели меня к NSURL Volume Property Keys, но ни один из них, похоже, не дал тип/протокол тома.

Тем не менее, можно видеть эту информацию с терминала diskutil функции под Protocol:

~/Temp$ diskutil info /dev/disk8 
    Device Identifier:  disk8 
    Device Node:    /dev/disk8 
    Part of Whole:   disk8 
    Device/Media Name:  Apple UDIF read-only Media 

    Volume Name:    Not applicable (no file system) 

    Mounted:     Not applicable (no file system) 

    File System:    None 

    Content (IOContent):  GUID_partition_scheme 
    OS Can Be Installed:  No 
    Media Type:    Generic 
    Protocol:     Disk Image <=== THIS IS WHAT I WANT 
    SMART Status:    Not Supported 

    Total Size:    5.2 MB (5242880 Bytes) (exactly 10240 512-Byte-Units) 
    Volume Free Space:  Not applicable (no file system) 
    Device Block Size:  512 Bytes 

    Read-Only Media:   Yes 
    Read-Only Volume:   Not applicable (no file system) 
    Ejectable:    Yes 

    Whole:     Yes 
    Internal:     No 
    OS 9 Drivers:    No 
    Low Level Format:   Not supported 

EDIT: Найдено some code что по крайней мере используется, чтобы сделать это, с помощью this included category extension to NSWorkspace. Тем не менее, это pre-ARC, и я не уверен, будет ли он работать.

Нашел через this partial answer на другой вопрос ..

+1

Я не пробовал, но как насчет NSURLVolumeIsEjectableKey, возможно, в сочетании с NSURLVolumeIsRemovableKey? Просто идея. –

+0

@MartinR Спасибо! Тем не менее, я думаю, что это также поймает съемные диски HD и SSD, которые будут обнаруживать диски, которые я * хочу *. (И прямо сейчас я получаю ложные срабатывания на каждом установщике dmg, который я открываю.) –

ответ

3

Вы можете получить эту информацию, используя DiskArbitration рамки. Чтобы использовать приведенный ниже пример, вы должны указать ссылку и #import.

#import <DiskArbitration/DiskArbitration.h> 

...

- (BOOL)isDMGVolumeAtURL:(NSURL *)url 
{ 

    BOOL isDMG = NO; 

    if (url.isFileURL) { 

    DASessionRef session = DASessionCreate(kCFAllocatorDefault); 
    if (session != nil) { 

     DADiskRef disk = DADiskCreateFromVolumePath(kCFAllocatorDefault, session, (__bridge CFURLRef)url); 
     if (disk != nil) { 

     NSDictionary * desc = CFBridgingRelease(DADiskCopyDescription(disk)); 
     NSString * model = desc[(NSString *)kDADiskDescriptionDeviceModelKey]; 
     isDMG = ([model isEqualToString:@"Disk Image"]); 

     CFRelease(disk); 

     } 

     CFRelease(session); 

    } 

    } 

    return isDMG; 

} 

Использование:

BOOL isDMG = [someObject isDMGVolumeAtURL:[NSURL fileURLWithPath:@"/Volumes/Some Volume"]]; 

Я надеюсь, что это помогает.

+0

Amazing. Самый совершенный ответ, на который можно надеяться на SO: рабочая функция, необходимый #import и пример вызова. Теперь он работает и работает в моем проекте. –

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