5

OSXでCocoa/Objective-Cを使用してマウント不可/イジェクト可能なドライブのリストを取得したいと思います。

NSWorkspace getFileSystemInfoForPath :::::が私を助けてくれることを望んでいました:

NSArray* listOfMedia = [[NSWorkspace sharedWorkspace] mountedLocalVolumePaths];
NSLog(@"%@", listOfMedia);

for (NSString* volumePath in listOfMedia)
{
    BOOL isRemovable = NO;
    BOOL isWritable  = NO;
    BOOL isUnmountable = NO;
    NSString* description = [NSString string];
    NSString* type = [NSString string];

    BOOL result = [[NSWorkspace sharedWorkspace] getFileSystemInfoForPath:volumePath 
                                                             isRemovable:&isRemovable 
                                                              isWritable:&isWritable 
                                                              isUnmountable:&isUnmountable 
                                                                description:&description
                                                                       type:&type];
    NSLog(@"Result:%i Volume: %@, Removable:%i, W:%i, Unmountable:%i, Desc:%@, type:%@", result, volumePath, isRemovable, isWritable, isUnmountable, description, type);
}

出力:

...
Result:1 Volume: /Volumes/LR Photos, Removable:0, W:1, Unmountable:0, Desc:hfs, type:hfs
...

「LRPhotos」は、取り外し可能および/またはマウント解除可能(または少なくともそうあるべきだと思います)の外付けドライブ(Thunderboltを介して接続)です。:)

これについては別の方法で行う必要がありますか?

前もって感謝します!

4

3 に答える 3

6

diskArbitration フレームワークを使用できます。

#import <DiskArbitration/DiskArbitration.h>
   +(NSMutableArray *)getListOfEjectableMedia
{
    NSArray *mountedRemovableMedia = [[NSFileManager defaultManager] mountedVolumeURLsIncludingResourceValuesForKeys:nil options:NSVolumeEnumerationSkipHiddenVolumes];
    NSMutableArray *result = [NSMutableArray array];
    for(NSURL *volURL in mountedRemovableMedia)
    {
        int                 err = 0;
        DADiskRef           disk;
        DASessionRef        session;
        CFDictionaryRef     descDict;
        session = DASessionCreate(NULL);
        if (session == NULL) {
            err = EINVAL;
        }
        if (err == 0) {
            disk = DADiskCreateFromVolumePath(NULL,session,(CFURLRef)volURL);
            if (session == NULL) {
                err = EINVAL;
            }
        }
        if (err == 0) {
            descDict = DADiskCopyDescription(disk);
            if (descDict == NULL) {
                err = EINVAL;
            }
        }
        if (err == 0) {
            CFTypeRef mediaEjectableKey = CFDictionaryGetValue(descDict,kDADiskDescriptionMediaEjectableKey);
            CFTypeRef deviceProtocolName = CFDictionaryGetValue(descDict,kDADiskDescriptionDeviceProtocolKey);
            if (mediaEjectableKey != NULL)
            {
                BOOL op = CFEqual(mediaEjectableKey, CFSTR("0")) || CFEqual(deviceProtocolName, CFSTR("USB"));
                if (op) {
                    [result addObject:volURL];
                }
            }
        }
        if (descDict != NULL) {
            CFRelease(descDict);
        }
        if (disk != NULL) {
            CFRelease(disk);
        }
        if (session != NULL) {
            CFRelease(session);
        }
    }
    return result;
}
于 2013-10-23T10:05:42.027 に答える
3

残念ながらgetFileSystemInfoForPath:、これを行うには実際には正しい方法ではありません。リムーバブルとは、ボリュームがCDやDVDなどのリムーバブルメディア上にあることを意味します。実際には、マウント不可はリムーバブルと同じ結果をもたらすようです。たとえば、getFileSystemInfoForPathを使用した結果に関するこの投稿を参照してください。したがって、ボリュームがリムーバブルメディア上にあるかどうかを単純に知りたい場合を除いて、別の手法を使用する必要があります。

本当に確認したいのは、ボリュームの接続バスの種類です。Firewire、USB、Thunderboltなどは、あなたが言っている意味ではマウントできません。ボリュームを選択して「接続バス」の下の「情報」ボタンを押すと、ディスクユーティリティでこの情報を確認できます。プログラムでこの情報を取得することははるかに困難であり、私が知る限り、IOKitを使用してのみ可能です。詳細は、アプリケーションからハードウェアにアクセスすることに関するAppleのドキュメントにあります。

于 2012-07-24T22:48:37.800 に答える
0

「diskutil」であるディスクユーティリティアプリのコマンドラインバージョンを使用し、パラメータ「list」を指定して実行し、出力をパイプしてプログラムに取り込むことができます(cocoaを使用する必要はありません)。

于 2012-08-29T10:14:16.750 に答える