2015-07-21 78 views
3

的磁盤映像(DMG)從Objective C(或Swift)開始,我需要確定安裝的卷是否是磁盤映像(從.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 

編輯:找到some code至少用於執行此操作,通過this included category extension to NSWorkspace裝置。但是,它是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

令人驚歎。在SO上可以找到最完美的答案:一個工作函數,所需的#import和一個示例調用。它現在正在運行在我的項目中。 –