Cocoa 在不弹出的情况下卸载驱动器/卷

Cocoa 在不弹出的情况下卸载驱动器/卷,cocoa,disk,core-foundation,nsworkspace,diskarbitration,Cocoa,Disk,Core Foundation,Nsworkspace,Diskarbitration,我想在不弹出的情况下卸载磁盘。为此,我尝试了以下代码 { NSString *path; CFStringRef *volumeName=(__bridge CFStringRef)path; DASessionRef session = DASessionCreate(kCFAllocatorDefault); CFURLRef pathRef = CFURLCreateWithString(NULL, CFSTR("/volumes/Untitled"), NULL);

我想在不弹出的情况下卸载磁盘。为此,我尝试了以下代码

{
  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);
}

它可以工作,但是我想要卷的动态路径,就像代码中的静态路径一样。我尝试将NSString更改为CFStringRef,然后尝试在路径的位置(“/volumes/Untitled”)使用,但仍然是一样的


欢迎任何建议。

首先,强烈建议您不要使用
kdadiskunmontoptionforce

这是一种使用基本错误处理和内存管理在给定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
函数中提供回调处理程序,仍然可以改进错误处理。

解决了我的问题,先生。要通知存在一些键入错误,如
DASessionRef session=DASession
if(disk)CFRelease(disk)
必须位于声明它的块内。